c++ - 关于C++虚拟继承的问题

标签 c++ inheritance virtual

以下代码来自《Inside the C++ object model》一书

#include <iostream>  
using namespace std;
class X{};
class Y: public virtual X{};
class Z: public virtual X{};
class A: public Y, public Z{};

int main()
{
     cout<<sizeof(X)<<" "<<sizeof(Y)<<" "<<sizeof(Z)<<" "<<sizeof(A)<<endl;
     return 0;
}

在我的电脑(Windows,VS2010)中,输出是:

1 4 4 8

这是我的问题

1, sizeof(X)=1

书上说当X类型生成两个实例时,说xa和xb。编译向 A 中插入一个字节,以便 xa 和 xb 可以具有不同的地址。我不太明白原因。

2, sizeof(Y)=4

通过使用虚拟继承,我们会不会有一个额外的虚拟指针?我想这可能与多态性中的虚拟指针不同。谁能给我 Y 的内存布局?

谢谢!

最佳答案

  1. 在类为空时编译新的一个字符,因此可以生成不同的对象
  2. sizeof(Y)=4 因为是虚继承,construct会生成32位系统上4字节的vptr表
  3. 如果您使用的是 visual studio,请在属性->C/C++/Command 中使用/d1reportAllClassLayout 来生成对象布局 Y 类对象布局将在 Visual Studio 上:
  4. Stanley B. Lippman 的书“Inside C++ object model”解释得非常好

 
        class Y size(4):
            +---
            0     | {vbptr}
            +---
            +--- (virtual base X)
            +---<br/>
      Y::$vbtable@:
       0    | 0
       1    | 4 (Yd(Y+0)X)    <p></p>

  vbi:     class  offset o.vbptr  o.vbte fVtorDisp
        X       4       0       4     0

关于c++ - 关于C++虚拟继承的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13156810/

相关文章:

c++ - 模板化 typedef 上的模板函数

c++ - 在 C++ 中对代数结构矩阵使用类的开销

java - 操作方法时出现问题 - Java

c++ - 虚拟模板设计

c++ - 你最喜欢的 STL 技巧是什么?

c++ - typeinfo 和dynamic_cast 外部未解析

c++ - C++ 中的 DLL 导出和继承

operating-system - Linux 中的虚拟软盘驱动器

c++ - 重写虚拟方法时,Cat 与 Animal 不协变

.net - 在 C++\Win32 中编辑控件文本更改消息