打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【面向对象笔记】Overload、Overwrite和Override
重载(Overload)、重写(Overwrite)与重覆(Override)就像三兄弟一样,经常在一起玩儿。这三兄弟也是面向对象的复用技术的核心,而实际上更标准的说法应该是,这“三重”是类型系统中子类型多态的体现。至于另一种多态就是现在用得也很多的参数多态,或者叫做高阶类型系统。

  我们先来看看子类型多态吧。子类型多态,顾名思义,就是子类型复用父类型拥有的一系列东西。那什么叫子类型呢?啥也不说了,最简单的理解就是继承,就是让一些类型比其他类型带来的信息更准确。假如有两个类型S和T,且S是T的子类型(S<:T),那么所有类型为S的项用在需要类型T的项的上下文中都是安全的。这个原则就是大名鼎鼎的安全代换原则,学面向对象的都懂,上一篇说向下转型是自动的也可以借此理解。

  对子类型更简单的理解就是T是S的子集。不过这又容易迷糊,明明S是T的子类型,可竟然T是S的子集!的确如此,但是S型元素集合却是T型元素集合的子集。为什么?一个类中,字段数越多,限制也就越多,带来的信息含量也就越多,所表示的值集也就越少。但是就类型本身,的确父类型倒成了子类型的子集了。

 

  继续来讲多态。没有子类型,自然不可能有子类型多态。所以许多书上说继承是多态的基础,显然这句话理解的多态是片面的。不过细细想来,我倒觉得子类型多态本身就是很片面的,因为子类型多态都只是对成员函数的多态。不过成员函数直接影响类型本身,所以子类型多态也可以算是类型本身的多态吧。

  先来说重载,你仔细一想,会发现重载压根不能算子类型多态的一种。为什么?重载是在同一个类中实现的嘛!哪来子类型呢?因此重载是另一种多态,叫做权宜多态,也就是允许一个多态值在遇到不同的类型时能产生不同的操作。因此再一看Java等中的重载就清楚了,就是将语义、功能相似的几个函数用同一个名字表示,但参数或返回值不同(包括类型、顺序不同)。

  然后就是重覆,或者叫覆盖。这个是非常典型的子类型多态了,通过假定的规则给一个项更多的类型,使得可以有选择地去忘记项的具体操作。因此重覆就是派生类函数覆盖基类函数,这个函数的名字、参数、返回值自然必须一样,我才知道该覆盖谁。

  那么有些不一样呢?那就是重写了。不过重写与重覆,在Java中混为一谈了,所以也不用做什么区分。但是C++由于虚函数机制,就导致二者的不同。重写与重覆的根本区别就是重写是派生类的函数屏蔽了与其同名的基类函数。

  具体区别可以列个表(以C++为例,这也是网上找来的,不做任何解释):

重载

重覆

重写

(1)相同的范围(在同一个类中);

(2)函数名字相同;

(3)参数不同;

(4)virtual 关键字可有可无。

(1)不同的范围(分别位于派生类与基类);

(2)函数名字相同;

(3)参数相同;

(4)基类函数必须有virtual 关键字。

(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual

关键字,基类的函数将被隐藏(注意别与重载混淆)。

(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual

关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。

 

  最后说说参数多态,也就是Java的泛型,或者C++的模板。在形式语言的类型论中的多态其实就是指这个多态,所以真要说起来,那还非常麻烦,也没必要。所谓参数多态实际上就是加了一层,以前我们的变量都是值变量,现在再加个类型变量嘛。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
C 中的Overload、Overwrite和Override
override(覆盖)与overload(重载)
C++函数重定义、重载、重写
C#中override和overload的区别
有谁 知道覆盖与覆写有什么详细的差别?
方法覆盖和方法重载必须满足的条件
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服