虚函数表的构造

下面程序会打印出什么?

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 class test
 6 {
 7 public:
 8     test()
 9     {
10         a  = 10;
11     }
12     
13     void Print1()
14     {
15         std::cout << "Print1()" << std::endl;
16     }
17     
18     virtual void Print2()
19     {
20         std::cout << "Print2()" << std::endl;
21     }
22     
23     void Print3()
24     {
25         std::cout << "Print3() , a = " << a << std::endl;
26     }
27     
28 private:
29     int a;
30 };
31 
32 int main()
33 {
34     test *p = nullptr;
35     p->Print1();
36     p->Print2();
37     p->Print3();
38     
39     return 0;
40 }

开始认为Print1和Print2会正常执行,因为都没有访问对象相关的成员,即使p为空指针也无所谓。 只是到Print3时才会崩溃,实际上,到Print2就崩溃了。

因为Print2是虚函数,虚函数的执行依赖虚函数表,而定义p时没有触发构造函数,所以虚函数表没有初始化。导致调用到Print2时就崩溃了。

打印结果:

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/13549938.html