首页 > 编程语言 > 详细

C++ 动态多态

时间:2020-02-21 11:51:38      阅读:82      评论:0      收藏:0      [点我收藏+]

背景

以前的学习,只是简单地知道:面向对象的三大特性(封装、继承、多态) ,在项目开发中,用到了多态而自己却不知道。

多态分为2种:静态多态(重载),动态多态。

  • 静态多态实际上就是函数重载,是编译器在编译期间完成的,所以称之为静态。
  • 动态多态: 通过继承重写基类的虚函数实现的多态,在程序运行时根据基类的引用(指针)指向的对象来确定自己具体该调用哪一个类的虚函数。 运行时在虚函数表中寻找调用函数的地址。

下面我们重点介绍动态多态(下文称 多态)

动态多态的概念

多态的常规用法:用一个父类的指针去调用子类中被重写的方法。

为什么不直接在子类中写一个同名的成员函数,从而隐藏父类的函数就好了?

举个例子:

将父类比喻为电脑的外设接口,子类比喻为外设,现在我有移动硬盘、U盘以及MP3,它们3个都是可以作为存储但是也各不相同。如果我在写驱动的时候,我用父类表示外设接口,然后在子类中重写父类那个读取设备的虚函数,那这样电脑的外设接口只需要一个。但如果我不是这样做,而是用每个子类表示一个外设接口,那么我的电脑就必须有3个接口分别来读取移动硬盘、U盘以及MP3。若以后我还有SD卡读卡器,那我岂不是要将电脑拆了,焊个SD卡读卡器的接口上去?

用父类的指针指向子类,是为了面向接口编程。大家都遵循这个接口,弄成一样的,到哪里都可以用,准确说就是:"一个接口,多种实现"。

多态的使用

使用多态必须满足以下条件

  • 基类中必须包含虚函数,并且派生类中一定要对基类中的虚函数进行重写。
  • 通过基类对象的指针或者基类对象的引用**调用虚函数。

在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。

如果对象类型是子类,就调用子类的函数;如果对象类型是父类,就调用父类的函数,(即指向父类调父类,指向子类调子类)此为多态的表现。

多态的原理

忽然感觉学了很长时间的C++只是知道有多态这样一个重要的概念,编程时怎么用,却真的没有仔细想一下它的机制,也就是它是怎么实现的。于是看了些资料,做一下总结。

先看一个例子:

技术分享图片

执行完之后的结果是这样的:

技术分享图片

这个很好理解,但当我们将函数g()加上virtual之后再看结果会看到

技术分享图片

技术分享图片

变成了4。这是因为在后者中变成了虚函数了。

virtual是让子类与父类之间的同名函数有联系,这就是多态性,实现动态绑定。

任何类若是有虚函数就会比比正常的类大一点,所有有virtual的类的对象里面最头上会自动加上一个隐藏的,不让开发者知道的指针,它指向一张表,这张表叫做vtable,vtable里是所有virtual函数的地址。

C++ 动态多态

原文:https://www.cnblogs.com/schips/p/12340391.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!