虚继承主要是为了解决菱形继承的问题。针对多继承的二义性本文不加分析,本文主要针对虚拟继承的内存进行分析。

首先看源码:

#include<iostream>

usingnamespace::std;

classA

{

public:

         intdataA;

};

classB: virtualpublicA

{

public:

         intdataB;

};

classC: virtualpublicA

{

public:

         intdataC;

};

classD: publicB,publicC

{

public:

         intdataD;

};

int_tmain(intargc,_TCHAR* argv[])

{

         cout<< "sizeof(A) = "<< sizeof(A)<< endl;

         cout<< "sizeof(B) = "<< sizeof(B)<< endl;

         cout<< "sizeof(C) = "<< sizeof(C)<< endl;

         cout<< "sizeof(D) = "<< sizeof(D)<< endl;

         system("pause");

         return0;

}

运行结果如下:

虚继承内存分析

使用vs命令行,将ABCD四个类的内存分布图打印出来如下:

虚继承内存分析

A类的内存布局中,在类中偏移量为0的位置,存储成员变量dataA

虚继承内存分析

B类的内存布局中,首先存储的是一个vbptr,然后存储的是数据成员dataB,然后是存储的基类A的部分。在vbptr指向的地址存储的是偏移量8,即偏移8为基类的地址。

 虚继承内存分析

C类的布局同B一致。

虚继承内存分析

D类中,首先存储的是继承自B类的部分,然后是继承自C类的部分,然后是D类自身的成员dataA,最后是基类A的部分。在图中,B类和C类都有一个vbptr,该vbptr分别指向到基类地址的偏移量。

从上面的内存分布,我们能一目了然的看出虚继承的原理。


相关文章:

  • 2022-01-03
  • 2021-05-18
  • 2021-12-21
  • 2022-12-23
  • 2021-10-09
猜你喜欢
  • 2021-07-30
  • 2022-01-11
  • 2022-01-23
  • 2021-07-06
  • 2021-09-09
相关资源
相似解决方案