【发布时间】:2014-10-20 18:59:15
【问题描述】:
示例代码如下:
class A
{
public:
int k;
virtual int f();
};
class B:public virtual A
{
public:
virtual int a();
};
int main()
{
cout<<sizeof(A)<<sizeof(B);
}
打印出来
8 12
class B 似乎有自己的新虚函数表。
如果class A 更改为:
class A
{
public:
virtual int f();
};
打印出来
4 4
谁能解释原因?
【问题讨论】:
-
如果基础是无状态的,那么您实际上不需要定位基础子对象,因此您需要的派生类中的信息更少。
-
@KerrekSB 给出答案 ;)
-
@KerrekSB 你的意思是编译器对派生类进行优化以使其简单吗?
-
@KerrekSB,这似乎并不那么明显。如果我们有 C,它也从 A 继承 virtualy,而 D 从 B 和 C 继承。将 D 转换为 B 然后 A 必须具有与将 D 转换为 C 然后 A 相同的指针,即使 A 没有状态。
-
您正在查看对象大小,而不是 v-table 大小。 sizeof(A) = v-table 指针 + k,sizeof(B) = A 的 v-table 指针 + B + k 的 v-table 指针。由于虚拟继承不再重要,因此可以在第二个 sn-p 中对其进行优化。
标签: c++ multiple-inheritance virtual-functions