天天看点

初识C++面向对象特性——多态

个人理解,用一句话来概括多态就是:一个接口(函数)能实现不同种方法

c++的多态分为静态多态和动态多态

静态多态:指的就是重载(编译的时候函数地址就已经确定)

动态多态:继承并重写基类的虚函数

关于静态多态(重载),比较简单,下面用两段代码来演示一下

第一段代码通过重载实现了函数的多态

第二段代码通过重载实现了类中成员函数的(静态)多态

为什么要使用虚函数来实现动态多态呢,因为存在这种情况:父类想通过多态的特性使用子类的成员函数,如下面代码所示

执行结果如下

初识C++面向对象特性——多态

 可以看到test想通过多态特性使用指针调用子类b中的成员函数,但是他调用的仍然是他自己的func1(),为什么会这样?就要从动态多态的实现原理——虚表说起

弄清了虚表结构之后回到上面的代码,通过虚函数我们能实现什么操作?虚函数该怎么用来实现(动态)多态?

首先通过虚函数,父类可以调用子类的成员函数

使用方法:

此时类a调用的function()就是子类中的function

要注意的是虚函数只能通过指针或者引用来达到多态效果,直接实例化一个类然后直接调用虚函数是无法实现多态的

解释一下为什么基类析构函数要写成虚函数

实际上,在编译器中,析构函数会被特殊处理,他们也是具有多态性的函数。a的类型是子类,所以析构a的时候需要用son的析构函数,但是如果父类中的析构函数没有使用虚函数,那么delete a在启动虚构函数时,会直接调用父类的析构函数,new son申请到的空间就没有得到回收,会造成内存泄漏。

总结一下多态的优点

可替换、可扩展、灵活、使用简单以及接口性(接口行是什么意思还没弄清)

继续阅读