有虚函数或虚继承关系的sizeof问题

1.只存在虚函数时的情况

存在VtPtr指针,指向虚函数表。在普通继承时,子类会修改父类的虚函数表(在尾部添加子类的虚函数指针),所以子类对象的首部不会增加自己的Vtptr。

具体内容见:

http://hi.baidu.com/jjsjmmkifxbaotq/item/0eb7e4304acb3b2cceb9fe3f

2. 存在虚继承关系时的情况

有关虚继承的定义,参见博文http://www.cppblog.com/chemz/archive/2007/06/12/26135.html

在多层继承关系中,虚基类为各子类共享,即内存中只有一份虚基类对象,所以子类不能修改虚基类的虚函数表,为什么不能修改下文再讲。故虚继承中,子类会有自己的Vtptr,同时会增加一个VBptr指向虚基类对象,所以会增加8B(多继承时会增加8B的整数倍)。

3.为什么不能修改虚基类的虚函数表?

如有下面继承关系的情况发生。


若D1修改了基类B的虚函数表,则继承类D2也会修改B的虚函数表,但是之前D1在虚函数表中的虚函数指针也会被D2所观察到,但是D2并没有继承D1,故没有权限使用D1的函数,所以这是不允许的。因此虚继承基类对象的内容继承类不应该修改。本质原因还是虚基类为所有继承类共享。

其他内容可参考http://www.cnblogs.com/itech/archive/2009/03/01/1399996.html


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值