首页 > C/C++ > C++虚函数多继承的虚函数表指针的测试

C++虚函数多继承的虚函数表指针的测试

2012年7月1日 发表评论 阅读评论 4700次阅读    

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() !

 

学习,一定要记得实践,才能真切的感受到知识的存在。

Share
分类: C/C++ 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.

注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。