下面程序会打印出什么?
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时就崩溃了。
打印结果: