C++虚函数多继承的虚函数表指针的测试
C++虚函数多继承的虚函数表指针的测试
看了很多关于虚函数的实现机制,现在来动手验证一下吧···
#include <iostream> using namespace std; class A { virtual a(){}; } ; class B{ virtual b() {} ; }; class CC : public A , public B { int a ;// 2*4 + 8 }; int main() { CC cc ; cout << sizeof( cc) << endl ; //结果12表示子类对于每一个含有虚函数的父类都保持一个虚函数表。 //具体调用机制比较麻烦,见深度探索C++面向对象模型。 A *pa = &cc ; B *pb = &cc ; cout << "&cc = " << &cc << endl ; cout << "pa = " << pa << endl ; cout << "pb = " << pb << endl ; //运行结果表明VC编译器是把虚函数表指针放在类内存布局的偏移为0处,当然不同编译器实现可能不同。 return 0 ; }
运行结果:
12
&cc = 0012FF74
pa = 0012FF74
pb = 0012FF78
Press any key to continue
是
下面的代码故意修改了虚函数表的内容!!!然后奇迹出现了···
class KULV { public : virtual a(){ cout << "I/'am class KULV::a() !"<< endl ;}; virtual b(){ cout << "I/'am class KULV::b() !"<< endl ;}; } ; int main() { KULV kulv ; KULV *pkulv = &kulv ; int *p = (int *)&kulv ; *p = *p + 4 ; pkulv->a() ; //竟然调用的是b() !!!! 这更加证明了一点:虚函数指针在类的偏移0处, //而且每次虚函数调用都要访问虚函数表,所以需要至少2此取指操作,效率相对低点。 //其实上述调用代码编译后可能被改为:( kulv->__vfptr[0] )( &kulv ) ; return 0 ; }
运行结果为:
I'am class KULV::b() !
学习,一定要记得实践,才能真切的感受到知识的存在。
分类: C/C++
近期评论