c++对象内存布局(虚表和虚指针)

参考文章:
http://blog.csdn.net/haoel/article/details/3081385
http://www.cnblogs.com/kekec/archive/2013/01/27/2822872.html
虚函数表中虚函数在虚表中出现的位置是按照类中成员申明顺序,然后子类在前,父类在后的方式。
以下所有的函数均为虚函数。
普通继承:
虚表指针存在于子类的头部

多重继承:
情况1:
虚表指针存在于各个父类的头部


注意:
1、由于子类中的g和h都没有被父类重载,实际上调用的时候是存在二义性的,编译不能够通过。
2、注意g1函数,如果Driver中还有虚函数,而且是只在Driver中出现的话,会合并到第一个_vptr指向的虚表中,按照在子类中申明的顺序排在虚表的最后。

重复继承:

这种情况下
D d;
d.ib = 0; //二义性错误,因为不知道访问的是哪个ib
d.B1::ib = 1; //正确
d.B2::ib = 2; //正确
虚继承:
虚继承 是面向对象编程中的一种技术,是指一个指定的基类,在继承体系结构中,将其成员数据实例共享给也从这个基类型直接或间接派生的其它类。
总结:
子类中:
第一个虚指针是指向的实体(父类,或者非虚继承的对象)的虚表。子类中有自己的虚函数也被append到这张虚表
第二个虚指针指向了虚对象的起始地址,如果有多个虚对象,指向的是虚对象的地址表。
剩下的虚指针就是对应的对象里面的指针了。
class B : virtual public A{};
普通虚继承:

第一个虚表指针,子类虚函数表
第二个虚指针,被虚拟继承的那个父类保存的地址的起始位置
第三个虚表指针,被虚拟继承的那个父类中对应的虚函数的虚表
多虚继承
virtual CParent1, CParent2


第二个指针指向了CParent1,就是CParent1虚表开始的地址
交换顺序:CParent1, virtual CParent2

结论是:虚表会交换位置,父类的虚表会append到第一个虚表中。
virtual CParent1, virtual CParent2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值