类的大小以及虚函数表

一、类的大小
一个类中,如果什么都没有,那么它所占的字节为1,如果在类中添加了一个函数(非虚函数),那么它的大小还是1,而如果是虚函数,创建对象时会多一个虚函数表指针__vptr,那么对于32位系统来说是4字节,对于64位系统来说是8字节。
二、虚函数
类中函数前有virtual这类关键字,则此函数为虚函数。

class Base
{
public:
	virtual ~Base();
}
Base::~Base();

三、虚函数表
Base类中存在虚函数,A继承Base类,那么这两个类都存在一个虚函数表。

class A : public Base
{
public:
}

虚函数表是一个指针数组,其元素是虚函数的指针,每个元素对应一个虚函数的函数指针。需要指出的是,普通的函数即非虚函数,其调用并不需要经过虚函数表,所以虚函数表的元素并不包括普通函数的函数指针。
虚函数表内的条目,即虚函数指针的赋值发生在编译器的编译阶段,也就是说在代码的编译阶段,虚函数表就可以构造出来了。
四、虚表指针
虚函数表是属于类的,而不是属于某个具体的对象,一个类只需要一个虚函数表即可。同一个类的所有对象都使用同一个虚函数表。
为了指定对象的虚函数表,对象内部包含一个虚函数表的指针,来指向自己所使用的虚函数表。为了让每个包含虚函数表的类的对象都拥有一个虚函数表指针,编译器在类中添加了一个指针,*__vptr,用来指向虚函数表。这样,当类的对象在创建时便拥有了这个指针,且这个指针的值会自动被设置为指向类的虚函数表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值