- C++通过virtual关键字实现晚绑定,即运行时绑定。
- vtable是一个指针,对于一个类唯一的指向了对象地址,vatble会被拷贝继承。
- 纯虚函数的vtable是空置的,无法直接被实例化。方法声明后加 = 0
- 虚函数禁止使用传值调用,防止产生对象切片。即传值的时候,函数只会对父类的函数加以拷贝,而丢弃子类的属性和方法,从而拷贝为一个父类的对象。使用纯虚函数可以编译器报错避免这一点,因为父类无法实例化。
- RTTI是通过向下类型转化实现的,即通过强制类型转化调用派生类特有的方法
- 虚函数重载时需要注意两点:1. 子类无法创建新的同名,不同参数或返回值(返回子类对象的情况除外p384)的函数,为了保持多态特性,从而使得子类对象可以通过基类调用。2. 父类有多个同名函数,子类重载其中一个,则剩余的会被隐藏,除非向上转换为基类。
- 基类的构造函数会在派生类初始化的时候调用。
- 构造函数和析构函数中调用的虚函数是当前类的函数,而不使用虚机制。因为构造顺序的原因,基类调用虚函数会使用派生类中没有初始化的属性,这是不允许的。因为此时,派生类的构造函数还未执行。 而对于析构函数,假如使用虚机制,派生类的析构函数和父类析构函数调用的虚函数可能会析构统一对象,从而造成错误。
- 纯虚析构函数满足在一个类不需要实例化,但是却没其他的函数可以定义为纯虚函数的时候,此时纯虚析构函数需要有一个定义。
- 运算符重载也可以是虚函数
- typeinfo RTTI 以及相关的动态类型转换以及静态类型转换