以下代码来自《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 的内存布局?
谢谢!
最佳答案
- 在类为空时编译新的一个字符,因此可以生成不同的对象
- sizeof(Y)=4 因为是虚继承,construct会生成32位系统上4字节的vptr表
- 如果您使用的是 visual studio,请在属性->C/C++/Command 中使用/d1reportAllClassLayout 来生成对象布局 Y 类对象布局将在 Visual Studio 上:
- 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/