被virtual关键字修饰的成员函数就是虚函数。虚函数的作用是实现多态性。所谓多态性就是以共同的方法,对不同的对象采取不同的策略(一个接口,多种方式)。
虚函数只能是类中的成员函数,而且不能是静态的。
15.1 C++程序员的演变
如果不用虚函数,就等于还不懂得面向对象程序设计。
15.2 向上类型转换
Instrument & Wind
15.3 问题
捆绑:函数体与函数调用相联系成为捆绑。
当捆绑在程序运行之前(由编译和连接器)完成时,称为早捆绑(early binding);
捆绑根据对象的类型,发生在运行时,称为晚捆绑或动态捆绑。
15.4 虚函数
虚函数实现动态的条件:
1. 类之间的继承关系满足赋值兼容性规则;
2. 改写了同名的虚函数;
3. 根据赋值兼容性规则使用指针(或引用)。
15.5 C++如何实现晚捆绑
为每个类设置VTABLE,初始化VPTR,为虚函数调用插入代码。
15.7 抽象基类和纯虚函数
纯虚函数使用关键字virtual,并在其后机上=0。
纯虚函数没有函数体,其作用是:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。
包含有纯虚函数的类称为抽象类,抽象类只能作为基类,所以又称抽象基类。
抽象类不能定义对象。
抽象类至少含有一个虚函数,而且虚函数中至少有一个纯虚函数。
15.11 虚析构函数
如果将基类的析构函数声明为虚函数,由该基类派生出的所有派生类的析构函数也都自动成为虚函数,即是派生类的析构函数与基类的析构函数名字不相同。
构造函数不能为虚函数,但是析构函数能够且常常必须是虚函数。