`
notguru
  • 浏览: 16308 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

C++ 类继承内存布局

    博客分类:
  • 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++类继承内存布局文档打包

    以上就是关于C++类继承内存布局的主要知识点。理解这些概念对于编写高效且可靠的C++代码至关重要,尤其是在涉及对象实例化、内存管理和多态性时。深入掌握这些内容有助于提升编程能力,避免潜在的性能问题和内存泄漏...

    c++继承中的内存布局

    ### C++继承中的内存布局详解 #### 1. 类如何布局? 在C++中,类的内存布局受到多个因素的影响,包括成员变量的类型、成员函数的存在与否、继承类型(如单继承、多重继承或虚继承)等。下面分别探讨不同情况下的类...

    C++ 内存对象布局

    与单一继承类似,多继承类对象的内存布局也由父类对象和自身成员共同决定。 ##### 1. **只有成员变量的情况** 如果派生类只包含成员变量而没有虚函数,那么对象的内存布局将是各个父类对象和自身成员的组合。 ###...

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

    在探讨“VC8.0上多重继承的内存布局”这一主题时,我们深入研究了C++语言中多重继承机制下的对象内存布局与虚函数表(virtual table)的组织方式,这是理解并有效利用C++多态性的关键。下面将详细阐述多重继承下对象的...

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

    C++对象的内存布局是一个复杂且重要的主题,涉及到类的成员变量、继承关系、虚函数表以及编译器的实现细节。本文将深入探讨几种特定情况下的C++对象内存布局,包括单一继承、虚拟继承、多重继承、重复继承和钻石型...

    C++对象内存布局

    ### C++对象内存布局 #### 1. 最简单的类 在C++中,理解对象的内存布局对于深入学习语言特性非常关键。通过分析一个简单的类`CTest`,我们可以更好地了解对象是如何在内存中分配和组织的。 ##### 1.1.1 赋值语句...

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

    ### C++继承中的内存布局详解 #### 一、引言 C++作为一种强大的面向对象编程语言,其在软件工程中的应用极为广泛。深入了解C++的内部实现机制,特别是类的内存布局及其在不同继承模式下的表现,对于提高程序效率、...

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

    《C++继承中的内存布局借鉴》探讨了C++对象模型,特别是从内存布局的角度解析了类的构造、成员变量和函数的访问、继承方式(包括单继承、多重继承和虚继承)以及各种语言特性的实现。这篇译文是理解C++对象模型的一...

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

    在 C++ 中,对象的内存布局主要由编译器决定,编译器会根据对象的继承关系和成员变量的类型来确定对象在内存中的布局。通常情况下,对象的内存布局可以分为以下几个部分: 1. 对象的虚函数表(vtable):虚函数表是...

    类的对象的内存布局

    在C++编程的世界里,类的对象内存布局是一个高级且复杂的议题。当涉及到继承、多态以及虚函数的使用时,这个问题就变得更加引人入胜。理解这些概念不仅可以帮助我们写出更加高效和规范的代码,而且在调试和性能优化...

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

    在C++编程中,对象的内存布局是一个关键概念,它涉及到类的成员变量、虚函数、继承等多个方面。本文将探讨这些因素如何影响C++对象在内存中的组织方式,特别关注单一继承、虚拟继承、多重继承、重复多重继承以及钻石...

    C++对象的内存布局[归纳].pdf

    在C++编程中,对象的内存布局是一个关键概念,它涉及到如何在内存中存储类的实例,包括成员变量和虚函数表等元素。本文将详细分析C++对象内存布局的各种情况,涵盖单一继承、虚拟继承、多重继承、重复继承以及钻石型...

    c++多态内存布局1

    首先,了解C++类的内存布局对于理解多态性至关重要。一个类的内存通常分为三部分:数据成员、非虚函数指针(如果有的话)和虚函数表指针(vptr)。在非多态类中,只包含数据成员和非虚函数指针。然而,在具有虚函数...

    c++继承分类

    C++继承是面向对象编程(OOP)中的一个核心概念,它允许我们创建新的类,这些新类可以扩展已存在的类的功能。在这个“c++继承分类”主题中,我们将深入探讨C++中的继承机制,以及如何在Qt环境中利用这一特性进行开发...

    c++程序设计 继承与派生实验(二)

    虚基类的使用确保了内存布局的一致性和多态性,特别是在动态绑定(dynamic binding)或运行时类型识别(RTTI)的情况下。 在这个实验中,你可能会使用到"第12周开摩托.exe"这个可执行文件来运行程序,"第12周实验....

Global site tag (gtag.js) - Google Analytics