虚函数
- 前有 virtual 关键字的成员函数
class base{
virtual int get();
}
int base::get{}
- virtual关键字只用在类的定义里的函数声明
- 构造函数与静态成员函数不能是虚函数
多态
表现形式 一
- 派生类的指针可以赋给基类的指针
- 通过基类指针调用基类和派生类中的同名虚函数
- 指向基类的对象,调用基类的虚函数
- 指向派生类,调用派生类的虚函数
表现形式 二
-
派生类的指针可以赋给基类引用
-
通过基类引用调用基类和派生类中的同名虚函数
- 引用的是基类的对象,调用基类的虚函数
- 引用的是派生类对象,调用派生类的虚函数
-
在非构造函数和非析构函数的成员函数中调用虚函数,就是多态
-
在构造函数与析构函数中调用虚函数,在编译时即可确定,调用的函数时自己的类或基类中定义的函数
多态的实现
依靠动态联编
虚函数表
- 每一个有虚函数的类都有虚函数表,该类的任何对象中都放着虚函数表的指针。
- 4个字节
虚析构函数,纯虚函数和抽象类
虚析构函数
- 把基类的析构函数声明为virtual
- 通过基类的指针删除派生类的对象时,首先调用派生类的析构函数,然后调用基类的析构函数
![[Pasted image 20231227154139.png]]
![[Pasted image 20231227154156.png]]
纯虚函数和抽象类
纯虚函数:没有函数体的虚函数
class A{
private: int a;
public:
virtual void Print()=0; //纯虚函数
void fun(){cont<<"fun";}
}
抽象类:包含纯虚函数的类
- 只能作为基类来派生新类使用,不能创建派生类的对象
- 抽象类的指针和引用可以指向由抽象类派生出来的类的对象
- A * pa;
- 抽象类的成员函数内可以调用纯虚函数(不包括构造函数或析构函数)
- 如果一个类从抽象类派生而来,那么当且仅当他实现了基类中所有的纯虚函数,他才能成为非抽象类