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++

近期评论