下面的代码输出什么?
1 #include<iostream> 2 using namespace std; 3 class A 4 { 5 public: 6 virtual void foo() 7 { 8 cout<<"hello A"<<endl; 9 } 10 }; 11 class B 12 { 13 public: 14 void foo() 15 { 16 cout<<"hello B"<<endl; 17 } 18 }; 19 void main() 20 { 21 A *pa = NULL; 22 B *pb = NULL; 23 pa->foo(); 24 pb->foo(); 25 26 }
分析:
1.对于class A 当pa->foo()时,编译器将调用转化为(*pa->vptr[1])(ptr);但是现在的pa=NULL,而vptr指针是在对象构造的时候初始化的,所以vptr是没有初始化的,所以调用pa->foo()的结果是不确定的。
2.而对于class B 当调用pb->foo()时,编译器将调用转化为B_foo(); 在class B 编译的时候已经将foo()函数编译成了独一无二的函数调用地址即B_foo(),所以pb->foo()输出hello B.