以前的学习,只是简单地知道:面向对象的三大特性(封装、继承、多态) ,在项目开发中,用到了多态而自己却不知道。
多态分为2种:静态多态(重载),动态多态。
下面我们重点介绍动态多态(下文称 多态)
多态的常规用法:用一个父类的指针去调用子类中被重写的方法。
为什么不直接在子类中写一个同名的成员函数,从而隐藏父类的函数就好了?
举个例子:
将父类比喻为电脑的外设接口,子类比喻为外设,现在我有移动硬盘、U盘以及MP3,它们3个都是可以作为存储但是也各不相同。如果我在写驱动的时候,我用父类表示外设接口,然后在子类中重写父类那个读取设备的虚函数,那这样电脑的外设接口只需要一个。但如果我不是这样做,而是用每个子类表示一个外设接口,那么我的电脑就必须有3个接口分别来读取移动硬盘、U盘以及MP3。若以后我还有SD卡读卡器,那我岂不是要将电脑拆了,焊个SD卡读卡器的接口上去?
用父类的指针指向子类,是为了面向接口编程。大家都遵循这个接口,弄成一样的,到哪里都可以用,准确说就是:"一个接口,多种实现"。
使用多态必须满足以下条件
在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。
如果对象类型是子类,就调用子类的函数;如果对象类型是父类,就调用父类的函数,(即指向父类调父类,指向子类调子类)此为多态的表现。
忽然感觉学了很长时间的C++只是知道有多态这样一个重要的概念,编程时怎么用,却真的没有仔细想一下它的机制,也就是它是怎么实现的。于是看了些资料,做一下总结。
先看一个例子:
执行完之后的结果是这样的:
这个很好理解,但当我们将函数g()加上virtual之后再看结果会看到
变成了4。这是因为在后者中变成了虚函数了。
virtual是让子类与父类之间的同名函数有联系,这就是多态性,实现动态绑定。
任何类若是有虚函数就会比比正常的类大一点,所有有virtual的类的对象里面最头上会自动加上一个隐藏的,不让开发者知道的指针,它指向一张表,这张表叫做vtable,vtable里是所有virtual函数的地址。
原文:https://www.cnblogs.com/schips/p/12340391.html