05.多态与虚函数
多态和虚函数的基本概念
- 虚函数
virtual
- 只用在类定义里的函数声明中, 写函数体时不用
- 构造函数和静态成员函数不能是虚函数
- 多态
- 派生类指针可以赋给基类指针
- 通过基类指针调用基类和派生类中的同名虚函数时
- 若该指针指向一个基类的对象, 那么被调用的是基类的虚函数
- 若该指针指向一个派生类的对象, 那么被调用的是派生类的虚函数
- 在非构造函数和非析构函数中调用虚函数, 是多态
多态实现原理
-
编译时不能确定, 运行时才能确定 动态联编
-
多态会有空间和时间上的额外开销
虚析构函数
-
在删除一个指向派生类的基类指针时, 只会调用基类的析构函数, 这会导致内存泄漏
-
解决方法
- 把基类的析构函数声明为virtual
- 派生类的析构函数virtual可以不进行声明
- 通过基类的指针删除派生类对象时
- 首先调用派生类的析构函数
- 然后调用基类的析构函数
- 类如果定义了虚函数, 则最好将析构函数也定义成虚函数
- 把基类的析构函数声明为virtual
纯虚函数和抽象类
-
纯虚函数: 没有函数体的虚函数
virtual void print() = 0;
-
抽象类: 包含纯虚函数的类
-
只能作为基类来派生新类使用
-
不能创建抽象类的对象
-
抽象类的指针和引用 -> 由抽象类派生出来的类的对象
-