我很难忘记以下课程的大小是什么? 我正在使用MSVS 2008(VC 9.0编译器)。 我已经读过,如果我没有声明虚函数(在下面的例子中),那么D类将包含2个额外的指针(来自B的1和来自C的另一个),它将指向A的共享实例。
但是在下面的情况下,每个类的内存映射是什么(也有虚函数)?
class A
{
public:
int a;
virtual void Func();
public:
A(void);
~A(void);
};
class B :virtual public A
{
public:
int b;
virtual void Func();
public:
B(void);
~B(void);
};
class C: virtual public A
{
public:
int c;
virtual void Func();
public:
C(void);
~C(void);
};
class D : public B, public C
{
public:
int d;
virtual void Func();
public:
D(void);
~D(void);
};
int _tmain(int argc, _TCHAR* argv[])
{
cout << "size of Class A :" << sizeof(A) << endl;
cout << "size of Class B :" << sizeof(B) << endl;
cout << "size of Class C :" << sizeof(C) << endl;
cout << "size of Class D :" << sizeof(D) << endl;
return 0;
}
输出:
A级尺寸:8
B级尺寸:20
C级尺寸:20
D级的大小:32
这里,B,C&amp; B的大小如何D正在计算?
编辑:以下是每个类的/ d1reportSingleClassLayoutXXX编译器选项生成的内存映射:
1>class A size(8):
1> +---
1> 0 | {vfptr}
1> 4 | a
1>class B size(20): //Similar for C
1> +---
1> 0 | {vbptr}
1> 4 | b
1> +---
1>8 | (vtordisp for vbase A)
1> +--- (virtual base A)
1>12 | {vfptr}
1>16 | a
1> +---
1>class D size(32):
1> +---
1> | +--- (base class B)
1> 0 | | {vbptr}
1> 4 | | b
1> | +---
1> | +--- (base class C)
1> 8 | | {vbptr}
1>12 | | c
1> | +---
1>16 | d
1> +---
1>20 | (vtordisp for vbase A)
1> +--- (virtual base A)
1>24 | {vfptr}
1>28 | a
vbase X的vtordisp是什么意思?
答案 0 :(得分:1)
我会说你在32位机器上,sizeof(int)
是4。
投机性:
首先,A:
的大小|int a (4)|vtable pointer A (4)|
第二,B和C的大小:
|A base instance (8)|pointer to A(4)|int b/c(4)|vtable pointer B/C|
第三,D的大小:
|A base instance (8)|pointer to A(4)|int c(4)|vtable pointer B(4)|pointer to A(4)|int d(4)|vtable pointer C(4)|
由于D
实际上并未从C
继承,因此可以重复使用vtable pointer C
。再次,这只是猜测。您应该尝试转储对象D的内存以确保。而且我不确定你的机器如何调整内存。
答案 1 :(得分:1)
很少使用它 - 但我们必须将它添加到从虚拟基础继承的类中 类,并覆盖虚函数,以防用户调用虚函数 构造函数或析构函数。
所以 - 它的MSVC(非常糟糕的未解决)解决方案&#34;如何在对象构建期间进行虚拟呼叫?&#34;。