多态的理解

继承召唤多态

子类继承父类而生,必定继承父类的“操作”,然后可能会在“操作”中添加一些自己特有的行为。此时“操作”与父类中原有的“操作”依然同名,但其内容实质已发生了一些变化。

不管子类还是父类,它们都将参与程序的代码。当子类、父类的同名“操作”同时出现在一段应用程序代码中时程序如何才能知道具体执行了哪个“操作”呢?这两个同名“操作”的具体执行内容分别是什么呢?这时“多态”就呼之欲出应运而生了。

一个“操作”随着所传递或捆绑的对象类型的不同能够做出不同的反应,其行为模式称为多态。由于传递或捆绑的对象类型是属于同一类继承层次中的,因而是继承在召唤多态性行为。

父类与子类的同名操作,只要标记上virtual,则该操作便具有多态性。

程序在编译时,当编译器发现带有virtual的“操作”时会暗暗记在心中,当后续编译遇到某对象(注意这里的对象不是一个实实在在的对象,而是一个对象的指针或引用,指向一个未确定的对象)对该“操作”的调用时,它也不能立即断定该“操作”的确切位置,即它不能确定该“操作”究竟是父类的还是子类的。此时编译器会避开某对象对“操作”捆绑的函数调用,只作一个指向实际对象的成员函数的间接访问(调用)。如此一来,实际对象若是父类,则调用父类成员函数;若是子类,则调用子类成员函数。

子类对象在构造时,首先量好自身尺寸大小,确定一个对象分配的位置(this),然后开始父类构造函数在this处构造一个对象,因而指针可能指向类层次中的上下不同对象。

多态是基于类的层次结构的,当指针飘忽不定地可能指向类层次中的上下不同对象时,以指针间访的形式实施的操作便是表现多态的最佳条件了。当然以引用传递的方式对“操作”函数进行调用,其效果也相当于指向未确定的对象,而且引用没有粗鲁的地址操作,可以更优雅地表现多态。另一个多态的条件是父类中必须有虚函数,否则即使有类的层次结构,也不会有多态。

为了在使用类的编程中随时随地地体现多态性,只要是继承结构,应尽量将成员函数设计成虚函数。

虚函数在继承层次结构中总是会自动地从父类传播下去,因此子类中的成员函数(继承来的同名函数)的virtual说明可以省略。

虚函数是子类对父类的函数覆盖而不是重载,而覆盖是一种浮在表面的遮掩,而不是渗透性、摧毁性重建。虚函数用于继承结构层次中的基类与子类。除了基类与子类的函数名必须相同外,连参数类型、个数和顺序都要相同,也就是说,基类和子类的虚函数不能只是名字重载,而是其声明要一模一样(因为是继承来的,所以一模一样,否则就不是继承来的,也无所谓多态,也就没有虚函数存在的意义了)。继承结构层次中,子类重定义父类的虚函数,导致不同类对象的该成员函数操作表现出不同的行为,成为成员函数的覆盖。否则,成员函数即使标记上virtual,也不会让编译作刮目相看的滞后处理。

如果父类和子类的虚函数仅存在返回类型的差异,则编译器会例外地施行滞后捆绑处理。

 

(原创博文,转载请注明出处)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值