使用父类方法重写的多重继承

时间:2019-05-14 18:08:08

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

比方说,我有以下类层次结构,其中有一个接口,然后该接口的进一步专门化保证了更多功能:

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,但我想知道是否存在针对此问题的更干净的解决方案。

1 个答案:

答案 0 :(得分: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的信息。