原味链接:http://blog.sina.com.cn/s/blog_728161840100u2ib.html
昨天面试,面试官让我说一说求一个类的sizeof应该考虑的问题,心想,太好了,之前sizeof可是做了不少功夫,就说了类的非静态、非全局成员,如果有虚函数就要加上一个指向虚表的指针,4字节大小,然后说,大概是这样。面试官就问,虚函数的实现机制是?大概讲了一下虚表之类的东东,然后他问,那如果是虚继承呢,求sizeof还是一样的么?先是一愣,心想,妈呀,什么是虚继承呢,然后还是淡定地回了,应该也是一样的吧,都是用一个指针来指向续表,面试官便没怎么说。
一、个空类
class A
{
};
二、简单的类
class A
{
}
三、子类普通继承、父类中不含虚函数
class A
{
}
class B:public A
{
}
sizeof(B)=sizeof(A)+sizeof(B.b)+4(指向虚表指针)
四、子类普通继承、父类含虚函数
class A
{
}
class B:public A
{
}
sizeof(B)=sizeof(A)-4(sizeof(A)中有一个指向虚表的指针)+sizeof(B.b)+4(指向虚表指针)
因为普通继承,子类和父类的虚函数存放在同一个虚表中,所以,只需要存一个指向续表的指针即可;
五、子类虚继承、父类不含虚函数
class A
{
}
class B:virtual public A
{
}
sizeof(B)=sizeof(A)+4(指示父类存放空间的起始偏移量)+sizeof(B.b)+4(指向B的虚表的指针)
六、子类虚继承、父类含虚函数
class A
{
}
class B:virtual public A
{
}
sizeof(B)=sizeof(A)+4(指示父类存放空间的起始偏移量)+sizeof(B.b)+4(指向B的虚表的指针)
虚继承时,父类和子类的虚函数表分开放,所以,分别存储两个指向对应续表的指针,因而不用减去sizeof(A)中续表指针的大小。
本文详细解析了 C++ 中 sizeof 运算符在不同情况下的计算规则,包括空类、含有虚函数的类、普通继承及虚继承等场景,并通过实际代码示例解释了虚函数和虚继承对类大小的影响。

6485

被折叠的 条评论
为什么被折叠?



