C++笔记6:多态

多态篇

一、概述

普通虚函数、虚析构函数、RTTI、异常处理、隐藏----覆盖、早绑定—晚绑定、虚函数表

二、虚函数 1、 多态

2、 静态多态VS动态多态 ? 静态多态(早绑定):

其中calArea是互为重载的两个函数,当我们实例化Rect对象之后,可以分别调用这两个函数,在调用之前就知道分别调用哪个函数了。这种情况叫做早绑定。

? 动态多态(晚绑定):

对不同的对象下达相同的指令,却做不同的操作。动态多态以封装和继承为基础。

以上打印出的都是父类的面积,这不是我们想要的。所以接下来我们要进行更改,引入虚函数:virtual。将要实现多态的成员函数前面加上virtual,更改代码如下:

3、 经典总结

1、只有类的成员函数才能声明为虚函数。

2、静态成员函数不能使虚函数,因为它不受限于某个对象。 3、内联函数不能使虚函数。 4、构造函数不能是虚函数。 5、析构函数可以是虚函数。

静态多态(早绑定)程序在运行之前,在编译阶段,已经决定到底要使用哪个函数了很早已经将函数编译进去了

动态多态(晚绑定):对不同的对象下达相同的指令,却做着不同的操作,必须以继承和封装为基础,至少为两个类

一个父类两个派生类,父类中的成员函数类型写成virtual两个派生类中要实现虚函数的最好也加上virtual

4、 存在的问题

虚析构函数:virtual->析构函数

(1) 虚析构函数:目的就是解决用父类的指针调用子类对象时产生的一些内存泄漏

问题,delete 指针,指针的类型是什么的,系统就会释放相应内存的空间。所以在父类的析构函数前加上“virtual”关键字,则在释放内存时,会同时释放掉子类对象的内存。

(2) 虚不是所有函数都能“虚的”:

内联函数不能是虚函数, 静态函数不能是虚函数, 构造函数不能是虚函数,

不是类的成员函数不能是虚函数,即普通函数不能是虚函数

5、 虚函数

函数指针:存放函数的首地址。

虚函数表:实例化类对象时,对象中会有虚函数表指针(四个内存单元),指向其虚函数表。类实例化出的所有对象,其虚函数表指针均指向相同的虚函数表。

若在子类中定义了与父类中同名的虚函数,子类的虚函数表中该虚函数对应的虚函数指针会覆盖父类对应的虚函数指针。

隐藏:父类与子类出现了同名函数称为函数的隐藏

覆盖:如果我们没有在子类当中定义同名的虚函数,那么在子类虚函数表当中,就会写上父类的虚函数的函数入口地址,如果我们在子类当中也定义了同名的虚函数,那么在子类的虚函数表当中把原来的父类的虚函数的函数地址覆盖,覆盖成子类的虚函数的函数地址。 6、 虚析构函数

执行完子类的析构函数就会执行父类的析构函数

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4