您的位置:首页 > 编程语言 > C语言/C++

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

2016-06-22 11:47 477 查看
参考文章:

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



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 class