关于C++虚表和虚指针

 
以下为个人的一些理解,如有不对,敬请大家斧正。
 
class base
{
public:
	virtual void act()
	{
		cout << "act_B" << endl;
	}
	virtual void fun()
	{
		cout << "fun_B" << endl;
	}
};
class derive: base
{
public:
	virtual void fun()
	{
		cout << "fun_D" << endl;
	}
	virtual void act()
	{
		cout << "act_D" << endl;
	}
};
 
虚表是C++用于实现多态的一种方式,每个拥有虚函数的类编译器都会为之分配一张虚表,指向虚表的指针即为虚指针,例如以上两个类base和device,分别就有一张虚表,包含有两个函数fun()和act()。
 
int main()
{
	derive dd;
        
	base bs;
        
	base *ptr_b;
        
	ptr_b = &bs;
        
	int **ptr = (int **) ptr_b; //指向基类对象bs
        
	cout << "Addr. of object bs:" << ptr << endl;
        
	cout << "Addr. of base::VTABLE: " << *ptr << endl;
        
	cout << "Indexing of virtual function bs.act( ):"
        
	<< "0x00" << hex << **ptr << endl;
        
	cout << "Indexing of virtual function bs.fun( ):"
        
	<< "0x00" << *(*ptr + 1) << endl;
        
	ptr++; //指向派生类对象dd
        
	cout << "Addr. of object dd:" << ptr << endl;
        
	cout << "Addr. of derive::VTABLE:" << *ptr << endl;
        
	cout << "Indexing of virtual function dd.act( ):"
        
	<< "0x00" << hex << **ptr << endl;
        
	cout << "Indexing of virtual function dd.fun( ):"
        
	<< "0x00" << *(*ptr + 1) << endl;
	return 0;
}

由以上例子看出,虚指针存储在对象空间中,由虚指针可以找到虚表,在由虚函数的排列顺序就可以找到每个函数的地址,我当前为高位先存,所以fun()地址比act()大,并且由于内存逻辑上是连续分配的,所以ptr++就可以得到子类对象的地址。
 
运行结果大家可以到文章用图里找。
 
参考:
http://wenku.baidu.com/view/a4ca7783e53a580216fcfedf.html
http://page.renren.com/601284443/note/819878679?&ref=share

                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值