【问题标题】:Multiple inheritence using parent class method override [duplicate]使用父类方法覆盖的多重继承[重复]
【发布时间】:2019-10-01 19:42:57
【问题描述】:

假设我有以下类层次结构,其中我有一个接口,然后对该接口进行进一步的特化,以保证更多的功能:

class parent_interface {
 public:
  virtual void foo() = 0;
};

class child1_interface : public parent_interface {
 public:
  virtual void bar() = 0;
};

class child2_interface : public parent_interface {
 public:
  virtual void baz() = 0;
}

然后我有提供该功能的具体类:

class parent : public parent_interface {
 public:
  void foo() override;
};

class child1 : public parent, public child1_interface {
 public:
  //using parent::foo; ??
  void bar() override;
};

问题是如果我尝试实例化一个 child1 对象,我会收到一个编译器错误

不能将字段 instantiation_name 声明为抽象类型,因为以下虚函数在 child1 中是纯的:void foo()

我可以通过在 child1 中创建一个名为 foo 的方法来解决这个问题,该方法只调用 parent::foo,但我想知道是否有更简洁的解决方案来解决这个问题。

【问题讨论】:

  • 你有一个菱形继承模式。如果您搜索例如c++ diamond inheritance pattern 你应该得到很多关于它的问题和可能的解决方案的点击。

标签: c++ multiple-inheritance virtual-functions


【解决方案1】:

您需要指定virtual 继承,以便编译器知道将基类组合回一个。这应该会为您编译 (see it work):

class parent_interface {
 public:
  virtual void foo() = 0;
};

class child1_interface : public virtual parent_interface {
 public:
  virtual void bar() = 0;
};

class parent : public virtual parent_interface {
 public:
  void foo() override
  {
  }
};

class child1 : public parent, public child1_interface {
 public:
  //using parent::foo; ??
  void bar() override
  {
  }
};

有关更多信息,您可以在此处阅读有关Virtual Base Classes 的信息。

【讨论】:

  • 啊,我试过让child1_interface和child2_interface虚拟继承parent_interface,但我没想到让parent虚拟继承parent_interface。另外,我认为没有必要让 child1 虚拟地从 parent 和 child1_interface 继承。常规继承工作正常。
  • 你说得对。您只需要在从接口派生之前指定virtual。我更新了答案中的代码以反映这一点。
猜你喜欢
  • 2015-09-19
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
相关资源
最近更新 更多