虚表的地址与虚继承类大小的计算

虚函数列表在程序编译的时候已经存在;

虚指针在new对象时生成,虚指针的大小与虚函数的多少没有关系,所有的虚函数都放在虚函数列表里,通过虚指针来查找!

虚函数列表的地址就是对象的首地址;

typedef  void (*FUN)();

如:father *f=new father;

father ff;

假如father有虚函数;

则虚函数列表的地址为:

*(int *)*(int *)f;  或者

*(int *)*(int *)(&ff) 

这就是虚函数列表的首地址;

依次取出就是:

FUN a= (FUN)(*((int *)*(int *)f+1);//第二个虚函数的地址;

调用:a();

或者:

FUN b=(FUN)(*((int *)*(int *)(&ff)+2);//第三个虚函数的地址;

调用:b();

虚继承的大小的计算:

例一:

#include <iostream>
#include <memory.h>
#include <assert.h>
using namespace std;
class A    //3+虚指针==8,最大字节对齐;
{
	char k[3];
public:
	virtual void aa(){};
};

class B : public  A  //k3+j3+虚指针(最大字节对齐)=12;
{
	char j[3];
public:
	virtual void bb(){};
};
class C : public  B  //k3+j3+i3+虚指针(最大字节对齐)=16;
{
	char i[3];
public:
	virtual void cc(){};
};
int main(int arge,char *argv[])
{
	cout<<"sizeof(A):"<<sizeof(A)<<endl;  //8
	cout<<"sizeof(B):"<<sizeof(B)<<endl;  //12
	cout<<"sizeof(C):"<<sizeof(C)<<endl;  //16

	system("pause");
	return 0;
}

例二:

#include <iostream>
#include <memory.h>
#include <assert.h>
using namespacestd;
class A    //3+虚指针==8,最大字节对齐;
{
       char k[3];
public:
       virtual void aa(){};
};
 
//虚继承所指向的虚基类的指针和new对象时产生的查找虚函数列表的指针不一样;
class B : public virtual A  //k3+j3+虚指针+指向父类的指针(最大字节对齐)=12+4;
{
       char j[3];
public:
       virtual void aa(){};
};
class C : public virtual B  //k3+j3+i3+虚指针+指向A类的虚指针+指向B类的虚指针(最大字节对齐)=16+8;
{
       char i[3];
public:
       virtual void aa(){};
};

int main(int arge,char *argv[])
{
       cout<<"sizeof(A):"<<sizeof(A)<<endl;  //8
       cout<<"sizeof(B):"<<sizeof(B)<<endl;  //16
       cout<<"sizeof(C):"<<sizeof(C)<<endl;  //24
 
       system("pause");
       return 0;
}

例三

#include <iostream>
#include <memory.h>
#include <assert.h>
using namespace std;
class A
{
	char k[3];
public:
	virtual void aa(){};
};
class B : public virtual A
{
	char j[3];
public:
	virtual void bb(){};

};
class C : public virtual B
{
	char i[3];
public:
	virtual void bb(){};  //没有新的虚函数,所以没有自己的虚函数列表;
	virtual void aa(){};  //都是重写虚基类的函数;
};
int main(int arge,char *argv[])
{
	cout<<"sizeof(A):"<<sizeof(A)<<endl;    //8
	cout<<"sizeof(B):"<<sizeof(B)<<endl;	//20
	cout<<"sizeof(C):"<<sizeof(C)<<endl;	//28
	system("pause");
	return 0;
}

有虚继承和虚函数的时候要看自己这个类里有没有新的虚函数有就多一个指向自己的虚函数列表的指针!!!







  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值