铁律一:最好不要在构造函数与析构函数的作用和析构函数中调用虚函数!
构造派生类对象时首先调用基类构造函数与析构函数的作用初始化对象的基类部分。在执行基类构造函数与析构函数的作用时对象的派生类部分是未初始化的。实际上此时的对象还不是一个派生类对象。
析构派生类对象时艏先撤销/析构他的派生类部分,然后按照与构造顺序的逆序撤销他的基类部分
因此,在运行构造函数与析构函数的作用或者析构函数时对象都是不完整的。为了适应这种不完整编译器将对象的类型视为在调用构造/析构函数时发生了变换,即:视对象的类型为当前构造函数与析构函数的作用/析构函数所在的类的类类型由此造成的结果是:在基类构造函数与析构函数的作用或者析构函数中,会将派生类對象当做基类类型对象对待
而这样一个结果,会对构造函数与析构函数的作用、析构函数调用期间调用的虚函数类型的动态绑定对象产苼影响最终的结果是:如果在构造函数与析构函数的作用或者析构函数中调用虚函数,运行的都将是为构造函数与析构函数的作用或者析构函数自身类类型定义的虚函数版本 无论有构造函数与析构函数的作用、析构函数直接还是间接调用虚函数。
详细情况在中有详细的論述 其主要结论如下: