`

C++ 类继承内存布局

 
阅读更多

C++继承分为两种,普通继承和虚拟继承(virtual)。具体的继承又根据父类中的函数是否virtual而不同。
下面就单继承分为几种情况阐述:
1.普通继承+父类无virtual函数
若子类没有新定义virtual函数 此时子类的布局是 : 由低地址->高地址 为父类的元素(没有vptr),子类的元素(没有vptr).
若子类有新定义virtual函数 此时子类的布局是 : 由低地址->高地址 为父类的元素(没有vptr),子类的元素(包含vptr,指向vtable.)

2. 普通继承+父类有virtual函数
不管子类没有新定义virtual函数 此时子类的布局是 : 由低地址->高地址 为父类的元素(包含vptr), 子类的元素.
如果子类有新定义的virtual函数,那么在父类的vptr(也就是第一个vptr)对应的vtable中添加一个函数指针.

3.virtual继承
若子类没有新定义virtual函数 此时子类的布局是 : 由低地址->高地址 子类的元素(有vptr),虚基类的元素.为什么这里会出现vptr,因为虚基类派生出来的类中,虚类的对象不在固定位置(猜测应该是在内存的尾部),需要一个中介才能访问虚类的对象.所以虽然没有virtual函数,子类也需要有一个vptr,对应的vtable中需要有一项指向 虚基类.
若子类有新定义virtual函数 此时子类的布局是与没有定义新virtual函数内存布局一致.但是在vtable中会多出新增的虚函数的指针.

4.多重继承
此时子类的布局是 : 由低地址->高地址 为父类p1的元素(p1按照实际情况确定元素中是否包含vptr), 父类p2的元素(p2按照实际情况确定元素中是否包含vptr),子类的元素.
如果所有父类都没有vptr,那么如果子类定义了新的virtual function,那么子类的元素中会有vptr,对应的vtable会有相应的函数指针.
如果有的父类存在vptr,我感觉如果子类定义的新的virtual function,会加在第一个有vptr的父类的vtable中.因为子类分配的空间显示并没有新增加一个4字节的指针空间.

分享到:
评论

相关推荐

    C++类继承内存布局详解图(一目了然)

    看了这个内存布局图详解之后,对于C++的了解更加深刻了,之前不懂得一头雾水的东西全都清楚了。

    C++类继承内存布局文档打包

    C++类继承内存布局文档打包

    c++继承中的内存布局

    1* 类如何布局? 2* 成员变量如何访问? 3* 成员函数如何访问? 4* 所谓的“调整块”(adjuster thunk)是怎么回事? 5* 使用如下机制时,开销如何: * 单继承、多重继承、虚继承 * 虚函数调用 * 强制转换...

    C++ 内存对象布局

    涉及各种情况下C++对象的sizeof大小,包括单一类对象,继承,重复继承 多继承 单一虚继承 等各种情况下的对象大小。对C++对象内存布局有清楚了解。

    VC8.0上多重继承的内存布局

    VC8.0上多重继承的内存布局

    c++继承中的内存布局 - 开源中国社区.pdf

    c++继承中的内存布局 - 开源中国社区

    c++继承中的内存布局借鉴.pdf

    c++继承中的内存布局借鉴.pdf

    (转)C++_对象的内存布局

    1)有成员变量的情况。 2)有重复继承的情况。 3)有虚拟继承的情况。 4)有钻石型虚拟继承的情况。

    类的对象的内存布局

    这是一些关于基类含有virtual函数或子类是virtual继承的对象的内存布局。其中有我截的一些图、内存布局图、文字说明,不过能力有限,说的不是很清楚,望谅解

    C++对象模型在内存中的实现

    C++对象模型在内存中的实现,讲述了类,继承以及虚继承的内存布局;成员变量和成员函数的访问已经访问时的开销情况,包含虚函数的情况,考察构造函数,析构函数,以及特殊的赋值操作符成员函数是如何工作的,数组是...

    C++ 内存布局虚继承 ---Empty virtual base classs (空虚基类)

    C++ 内存布局虚继承 ---Empty virtual base classs (空虚基类).doc

    C++ 对象的内存布局(上)1

    -) 对象的影响因素 简而言之,我们一个类可能会有如下的影响因素: 1)成员变量2)虚函数(产生虚函数表)3)单一继承(只继承于一个类)4)多重继承(继承多个类

    C++菱形继承分析

    C++菱形继承对象构造部分分析和虚表内存布局,附件包括了源码和二进制文件

    从汇编看c++的虚拟继承以及其内存布局

    先看第一种简单的情形,所有类中没有任何虚函数的菱形继承。  下面是c++源码: class Top {//虚基类 public:  int i;  Top(int ii) {  i = ii;  } }; class Left : public virtual Top { public: ...

    关于C++对象继承中的内存布局示例详解

    本文给大家介绍的是关于C++对象继承的内存布局的相关内容,分享出来供大家参考学习,在开始之前说明下,关于单继承和多继承的简单概念可参考此文章 以下编译环境均为:WIN32+VS2015 虚函数表 对C++ 了解的人都应该...

    浅谈C++中派生类对象的内存布局

    (1)派生类完全拥有基类的内存布局,并保证其完整性。 派生类可以看作是完整的基类的Object再加上派生类自己的Object。如果基类中没有虚成员函数,那么派生类与具有相同功能的非派生类将不带来任何性能上的差异。...

    C++对象的内存布局

    不想,这篇文章成为了打开C++对象模型内存布局的一个引子,引发了大家对C++对象的更深层次的讨论。当然,我之前的文章还有很多方面没有涉及,从我个人感觉下来,在谈论虚函数表里,至少有以下这些内容没有涉及:1)...

Global site tag (gtag.js) - Google Analytics