【问题标题】:C++: Virtual InheritanceC++:虚拟继承
【发布时间】:2013-02-06 08:05:59
【问题描述】:

考虑下面的代码:

#...
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)<<".";

 ...
}

O/P:1 1 4 8。

问题:

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

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

【问题讨论】:

  • 这里的第一个问题:+1 表示一篇好的、格式良好且不言自明的帖子。
  • 我真的没有看到任何问题,只是一个陈述列表。
  • @JoachimPileborg - “2. 当实际上没有任何东西存在时,为什么编译器会费心在 C 类对象中添加 vptr”。我猜3..2 相同。 1. 最有可能 - 表明 OP 知道为什么结果是 1
  • 优秀有趣的第一个问题
  • @meh 一个问题通常以问号结尾(比如这个?)。代码不完整(即无法编译),并且带有窗口的扩展。因此,我不会称其为格式良好且不言自明的帖子。

标签: c++ virtual-inheritance


【解决方案1】:

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

Why is the size of an empty class in C++ not zero?

【讨论】:

    【解决方案2】:

    广告1。见PeddleSpam's answer

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

    广告 3。见 2。

    【讨论】:

      猜你喜欢
      • 2016-03-26
      • 2011-01-08
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多