1、不在构造和析构函数里边调用虚函数
一个基类里边有一个构造函数和纯虚函数,然后基类的构造函数的实现里边调用了这个纯虚函数。
子类public继承基类,子类中对基类的纯虚函数进行了重新实现。
此时我们构造一个子类对象:
由于子类public继承于基类,那么子类对象构造的时候会首先调用基类的构造函数,在调用基类的构造函数的时候
基类构造函数里边的虚函数会被调用而不是子类里边的虚函数,即使目前要创建的对象是子类类型
在Base class 构造期间的析构函数不会下降到子类阶层,还有一种说法就是在构造函数期间Virtual函数不是虚函数。
造成的后果:在Base class 的构造函数执行的时候如果虚函数的执行下降到子类,那么Derived 的函数必然会取用Derived 类的local 变量。然而这些local 变量没有被初始化
更深层次的原因是,Derived class 对象 的 Base class部分在构造期间,对象的类型是Base 而不是Derived 类型,如果使用运行期间的类型信息,可以发现对象的类型为Base,也就是说
在Derived class的构造函数没有执行之前对象的类型为Base 类型。
析构函数也是同理
2、区分接口继承和实现继承
Effective c++ 整理
最新推荐文章于 2024-07-17 20:43:45 发布