NO.8:绝不在构造或者析构过程中调用virtual函数

NO.8:绝不在构造或者析构过程中调用virtual函数

在构造和析构执行期间不要调用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 }