5

考虑下面的代码:

#...
class A {};
class B: public A{};
class C: virtual public A{};
class D: virtual public C{};
// No More Classes
...
int _tmain(int argc, _TCHAR* argv[]) {
 cout<<sizeof(A)<<" ";
 cout<<sizeof(B)<<" ";
 cout<<sizeof(C)<<" ";
 cout<<sizeof(D)<<".";

 ...
}

输出:1 1 4 8。

问题:

  1. sizeof(A) = 1byte,这个位置对编译器/我们来说很重要。
  2. 当实际上没有任何东西存在时,为什么编译器会费心在 C 类对象中添加 vptr。
  3. 如果我们没有任何虚函数,编译器会向派生对象添加一个额外的 vptr。

*。这是我的第一个问题,如果您发现任何错误,请纠正我。

4

2 回答 2

8

简而言之,这不是因为类是否是虚拟的,而是因为标准要求所有对象都可以通过它们的内存地址来区分。看到这个问题:

为什么 C++ 中空类的大小不为零?

于 2013-02-06T08:12:22.097 回答
0

广告 1. 查看PeddleSpam 的回答

ad 2. IIRC 编译器将更多的信息放入所谓的 VMT 中,而不仅仅是虚函数指针。我认为还有一个信息是虚拟 A 在 C 中的位置。

广告 3。见 2。

于 2013-02-06T09:57:50.280 回答