普通继承和虚拟继承的内存布局原则

环境: windows xp 3     VC2008

如果类A拥有虚函数,而类B普通继承自类A,那么一个类B的对象在内存布局里:类B的虚表会将类A虚表合并覆盖,然后先排列类A的数据,再排列类B的数据

如果类B虚拟继承自类A,那么一个类B的对象在内存布局里:类B的虚表和内容都不会将类A的合并,在类B的虚表之后插入一个虚基表,通过这个表来访问类A。

时间: 2024-10-11 20:18:56

普通继承和虚拟继承的内存布局原则的相关文章

C++虚继承的实现方式与内存布局

说明:本文给出的结论均是在VS2010下调试的结果. 一.问题引入 下面的四个类是典型的C++虚继承的基本结构,现在的问题是这四个类对象的sizeof分别是多少? class Base{ //虚基类 public: double dou; }; class Derived1 : public virtual Base{ //虚继承 public: double in; }; class Derived2 : public virtual Base{ //虚继承 public: double on

C++ 继承、多继承、虚拟继承对象模型

C++面向对象语言一大难点是继承,但又是不得不掌握的.简单的继承是很容易理解的,但是当涉及到多继承,设计到虚函数的继承,特别是涉及到虚继承时,问题就会变得复杂.下面的内容来自参考资料中的三篇文章.C++的继承学习中,最主要是要掌握派生类的对象模型,基类和派生类指针之间的向上向下类型转换,当继承中的出现虚函数成员函数的访问(多态),虚继承是如何通过引入虚基表解决"菱形继承"中存在多份公共基类的问题. 一.简单的对象模型 1.定义 class MyClass { public: int v

深入理解虚表之非虚拟继承及虚拟继承

非虚拟继承 [带虚函数的类] class Base { public: virtual void FunTest1() { cout<<"Base::FunTest1()"<<endl; } virtual void FunTest2() { cout<<"Base::FunTest2()"<<endl; } int _data1; }; int main() { Base b; b._data1 = 0x01; re

C++ 类的继承、虚拟继承、隐藏、占用空间

主函数: 1 #include <iostream> 2 #include "test.h" 3 #include "testfuc.h" 4 using namespace std; 5 6 int main(void) 7 { 8 a *p=new b(); 9 10 p->fuc(); 11 12 cout<<"指针p占用空间"<<sizeof(p)<<endl; 13 cout<

C++虚拟继承 类的内存布局

1. 单个虚拟继承 只是为了分析而已,实际中并没有太大的作用.跟虚拟继承相关的派生类对象的内存布局跟具体的编译器相关. (1)VS编译器:无论有无虚函数,必然含有虚基类表指针.虚基类表中的内容为本类实例的偏移和基类实例的相对偏移值.如果有虚函数,那么基类的虚函数表跟派生类的虚函数表是分开的. 在内存布局上,地址从低到高,顺序如下:派生类的虚函数表指针+虚基类表指针+派生类的成员变量+"间隔"(4个字节)+基类的虚函数表指针+基类的成员变量.派生类跟基类实例的位置关系跟普通继承正好相反.

C++ 对象的内存布局—— 虚继承下的虚函数

C++ 对象的内存布局(下)这篇文章的"单一虚拟继承"和"钻石型虚拟继承"时的类内存布局讲得不太清楚,我有一处疑问,我用的是VS2005.因此记录一下. 类继承图例如以下: 这里:类B被类B1和B2虚拟继承,而B1和B2同一时候被D继承. B1的f().B2的f()覆盖了B的f(): D的f()覆盖了B1的f(),D的f1()覆盖了B1的f1() D的f()覆盖了B2的f(),D的f2()覆盖了B2的f2() 类代码例如以下: class B { public: i

【转】c++继承中的内存布局

今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的.看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用. ——谈VC++对象模型(美)简.格雷程化    译 译者前言 一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细节.对于使用VC++的程序员来说,还应该了解一些VC++对于C++的诠释. Inside the C++ Object Model虽然是一本好书,然而,书的篇幅多一些,又和具体的VC++关系小一些.因此,从篇幅和内容来看,译者认为本文

C++各种类继承关系的内存布局

body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;} th{border: 1px solid gray; padding: 4px; background-color: #DDD;} td{border: 1px solid gray; padding: 4px;} tr:nth-child(

c++,为什么要引入虚拟继承

虚拟基类是为解决多重继承而出现的. 以下面的一个例子为例: #include <iostream.h> #include <memory.h> class CA { int k; //如果基类没有数据成员,则在这里多重继承编译不会出现二义性 public: void f() {cout << "CA::f" << endl;} }; class CB : public CA { }; class CC : public CA { }; c