【Effective C++】条款09:绝不在构造函数和析构函数过程中调用virtual函数

 在A class对象的base class构造期间,对象的类型是base class,而不是A class,不只是virtual函数会被编译器解析至base class,若运行期间类型信息,例如dynamic_case 和typeid,也会把对象视为base class类型。相同道理也适用析构函数。

 1 #include <windows.h>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 class Base
 6 {
 7 public:
 8     Base()
 9     { 
10         OPe();
11     }
12 
13     virtual ~Base()
14     {
15         OPe();
16     }
17 
18     virtual void OPe()
19     {
20         cout << "Base::Fuction" << endl;
21     }
22 };
23 
24 class A : public Base
25 {
26 public:
27     A()
28     {
29         OPe();
30     }
31 
32     virtual ~A()
33     {
34         OPe();
35     }
36 
37     virtual void OPe()
38     {
39         cout << "A::Fuction" << endl;
40     }
41 };
42 
43 // 这样定义一个A的对象,会输出什么?  
44 int main()
45 {
46     {A a;}
47     system("pause");
48     return 0;
49 }

输出结果:

猜你喜欢

转载自www.cnblogs.com/sunbines/p/9544814.html