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++代码至关重要,尤其是在涉及对象实例化、内存管理和多态性时。深入掌握这些内容有助于提升编程能力,避免潜在的性能问题和内存泄漏...
### C++继承中的内存布局详解 #### 1. 类如何布局? 在C++中,类的内存布局受到多个因素的影响,包括成员变量的类型、成员函数的存在与否、继承类型(如单继承、多重继承或虚继承)等。下面分别探讨不同情况下的类...
与单一继承类似,多继承类对象的内存布局也由父类对象和自身成员共同决定。 ##### 1. **只有成员变量的情况** 如果派生类只包含成员变量而没有虚函数,那么对象的内存布局将是各个父类对象和自身成员的组合。 ###...
在探讨“VC8.0上多重继承的内存布局”这一主题时,我们深入研究了C++语言中多重继承机制下的对象内存布局与虚函数表(virtual table)的组织方式,这是理解并有效利用C++多态性的关键。下面将详细阐述多重继承下对象的...
这是一个关于C++对象模型的详细解释,涵盖了C++类继承内存布局、成员变量和成员函数的访问、虚继承、虚函数调用、强制转换到基类、异常处理等知识点。 首先,文章介绍了为什么需要了解C++对象模型,对于C++程序员来...
### C++对象内存布局 #### 1. 最简单的类 在C++中,理解对象的内存布局对于深入学习语言特性非常关键。通过分析一个简单的类`CTest`,我们可以更好地了解对象是如何在内存中分配和组织的。 ##### 1.1.1 赋值语句...
### C++继承中的内存布局详解 #### 一、引言 C++作为一种强大的面向对象编程语言,其在软件工程中的应用极为广泛。深入了解C++的内部实现机制,特别是类的内存布局及其在不同继承模式下的表现,对于提高程序效率、...
C++对象的内存布局是一个复杂且深入的主题,涉及到C++类的设计、继承机制、虚函数表以及内存管理等多个方面。本文将详细探讨不同类型的继承情况对C++对象内存布局的影响。 首先,我们需要理解对象内存布局的基本...
《C++继承中的内存布局借鉴》探讨了C++对象模型,特别是从内存布局的角度解析了类的构造、成员变量和函数的访问、继承方式(包括单继承、多重继承和虚继承)以及各种语言特性的实现。这篇译文是理解C++对象模型的一...
在C++编程中,类的对象内存布局是一个关键的议题,特别是涉及到多态性、继承和虚函数时。这里我们将深入探讨这些概念,并结合你提供的"类的继承"这个主题进行详细解析。 首先,让我们理解一个类的对象在内存中的...
在 C++ 中,对象的内存布局主要由编译器决定,编译器会根据对象的继承关系和成员变量的类型来确定对象在内存中的布局。通常情况下,对象的内存布局可以分为以下几个部分: 1. 对象的虚函数表(vtable):虚函数表是...
在C++编程中,对象的内存布局是一个关键概念,它涉及到类的成员变量、虚函数、继承等多个方面。本文将探讨这些因素如何影响C++对象在内存中的组织方式,特别关注单一继承、虚拟继承、多重继承、重复多重继承以及钻石...
C++ 内存布局虚继承 ---Empty virtual base class (空虚基类) C++ 中的虚拟继承是一种特殊的继承机制,它允许一个派生类从多个基类继承,而不产生钻石继承问题。虚拟继承的实现方式是在编译器的实现中,并且不同的...
在C++编程中,对象的内存布局是一个关键概念,它涉及到如何在内存中存储类的实例,包括成员变量和虚函数表等元素。本文将详细分析C++对象内存布局的各种情况,涵盖单一继承、虚拟继承、多重继承、重复继承以及钻石型...
首先,了解C++类的内存布局对于理解多态性至关重要。一个类的内存通常分为三部分:数据成员、非虚函数指针(如果有的话)和虚函数表指针(vptr)。在非多态类中,只包含数据成员和非虚函数指针。然而,在具有虚函数...
C++继承是面向对象编程(OOP)中的一个核心概念,它允许我们创建新的类,这些新类可以扩展已存在的类的功能。在这个“c++继承分类”主题中,我们将深入探讨C++中的继承机制,以及如何在Qt环境中利用这一特性进行开发...