【发布时间】:2013-02-26 10:09:42
【问题描述】:
#include "stdafx.h"
#include <iostream>
using namespace std;
class ClassA
{
protected:
int width, height;
public:
void set_values(int x, int y)
{
width = x;
height = y;
}
};
class ClassB : virtual public ClassA
{
//12(int + int + vptr)
};
class ClassC : virtual public ClassA
{
//12(int + int + vptr)
};
class ClassD : public ClassB, public ClassC
{
};
int main()
{
ClassA A;
ClassB B;
ClassC C;
ClassD D;
cout << "size = " << sizeof(A) << endl;
cout << "size = " << sizeof(B) << endl;
cout << "size = " << sizeof(C) << endl;
cout << "size = " << sizeof(D) << endl;
return 0;
}
我得到的输出是:
size of ClassA = 8
size of ClassB = 12
size of ClassC = 12
size of ClassD = 16
在上面的代码中,为什么 ClassD 的输出是 16。请清楚地解释一下这个虚拟继承是如何工作的。
【问题讨论】:
-
这取决于实现。无论如何,您为什么要依靠大小来确定特定的东西?如果您需要尺寸,只需使用
sizeof,它会返回适当的尺寸。出于理论目的知道这一点很好,但这绝对没有实际应用。 -
int + int + 2 * vptr?
-
只是为了了解这个虚拟继承。根据我的说法,ClassD 的大小应该是 24 字节,即 (int + int + vptr) + (int + int + vptr) = 24 bytes 。所以我很困惑这是如何工作的所以问..
-
@Jon:虽然这里没有虚函数,所以应该不需要任何 vptrs,AFAICS。
-
@OliCharlesworth 需要 vtable 才能定位
ClassA子对象。
标签: c++ sizeof virtual-inheritance memory-layout vptr