【问题标题】:virtual keyword in inheritance [duplicate]继承中的虚拟关键字[重复]
【发布时间】:2013-01-04 19:50:05
【问题描述】:

可能重复:
In C++, what is a virtual base class?

在此代码中,当创建 DR 对象时,字符串“Hello World”应该打印 4 次,而不是只打印 3 次。为什么会这样? 据我推测,这是因为 mid1 和 mid2 实际上是继承的。 谁能解释一下当我们虚拟继承一个类时会发生什么,更重要的是它什么时候有用?为什么?

#include <iostream>

struct BS
{
  BS()
  {
    std::cout << "Hello World" << std::endl;
  }
  unsigned int color;
};

struct mid1 : virtual public BS { };
struct mid2 : virtual public BS { };
struct mid3 : public BS { };
struct mid4 : public BS { };

struct DR : public mid1, public mid2, 
            public mid3, public mid4 { };

int main(int argc, char** argv) 
{ 
  DR d;
  return 0; 
}

【问题讨论】:

  • 您的意思是““Hello World”应该打印 3 次,所以是这样。”?
  • 没有,根据我所掌握的有限知识,它计算为 4。但它正在打印 3。我想知道原因。
  • 作为记录,this answer 解释得很好。
  • @K-ballo:我知道编译器会这样。我想知道原因。

标签: c++ inheritance virtual


【解决方案1】:

我们来看一个简化的例子:

class base {};

class mid1 : public base {};
class mid2 : public base {};

class derived1 : public mid1, public mid2;

class mid1a : virtual public base {};
class mid2a : virtual public base {};

class derived2 : public mid1a, public mid2a {};

如果我们为这些绘制对象图,我们会得到这样的结果:

当中间类使用虚拟继承时,派生类只包含基类的单个实例,而不是每个中间类的单独实例。

在您的情况下,这会导致基类的三个实例而不是四个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 2015-11-21
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多