在构造和析构执行期间不要调用virtual函数,因为这类调用从不会下降至derived class(比起当前执行构造函数和析构函数)
如果在base class 构造函数或者析构函数调用virtual,derived class构造时会先构造base class,则base class中的virtual实际调用是base class的;
第一种解释:derived class类先执行构造base class部分,然而在base class构造过程中,derived class部分是为初始化的,如果base class调用的virtual是derived clas则会发生可怕的错误,所以C++不允许,C++让virtual吊桶base class的.
第二种解释(不算解释):构造/析构base class期间,virtual不是virtual(非正规说法)
第三种解释(根本原因):在derived class构造base class期间,对象的类型是base class而不是derived class. 这些virtual会被正确 (resolv to),且RRTI类型检测也会认为是base class,因为C++ 认为derived class部分未被初始化,所以面对它们,C++最安全的做法是视它们不存在
1 #include <iostream> 2 3 4 class Base 5 { 6 public: 7 Base() 8 { 9 Show(); 10 } 11 virtual void Show() 12 { 13 std::cout<<"Base Show()"<<std::endl; 14 } 15 }; 16 17 18 class Derived: public Base 19 { 20 public: 21 Derived():Base() 22 { 23 24 } 25 26 void Show() override 27 { 28 std::cout<<"Derived Show()"<<std::endl; 29 } 30 }; 31 32 33 34 35 int main(int argc, char **argv) 36 { 37 Derived A; 38 39 return 0; 40 }