继承与纯虚函数混为一谈,有什么办法不必重新定义它们?

Inheritance mess with pure virtual functions, any way to not have to re-define them all?

所以我发现自己在 class 层次结构中有点混乱。

我的代码看起来有点像那样,过于简单化了:

#include <iostream>

struct Parent {
  virtual void pureVirtual() = 0;
};

struct Child : public Parent {
  void pureVirtual() override {
    std::cout << "Child::pureVirtual()" << std::endl;
  }
};

struct Brother: public Parent {
};

struct GrandChild : public Child, public Brother {
};

GrandChild test;

编译失败:

object of abstract class type "GrandChild" is not allowed: -- pure virtual function "Parent::pureVirtual" has no overriderC/C++(322)

我不完全理解为什么 pureVirtual 的实现没有被 GrandChildChild 继承。

在实践中,我有大量的纯虚函数要“重新实现”,也就是说,只需编写如下行:

struct GrandChild : public Child, public Brother {
  void pureVirtual() override {
    Child::pureVirtual();
  }
};

我本以为编译器会自动使用 Child 的实现。

有什么技巧可以告诉编译器我要重用 Child 中的所有实现吗?

无论如何,我可能不得不考虑更好的设计,但如果有简单的解决方案,这让我很感兴趣。

问题是您实际上 得到两个 pureVirtual 函数。默认情况下,C++ 不够聪明,无法合并两者。您可以使用 virtual inheritance 来强制执行此行为。

#include <iostream>

struct Parent {
  virtual void pureVirtual() = 0;
};

struct Child : virtual public Parent {
  void pureVirtual() override {
    std::cout << "Child::pureVirtual()" << std::endl;
  }
};

struct Brother : virtual public Parent {};

struct GrandChild : public Child, public Brother {};

int main() {
  GrandChild test;
}

I don't fully understand why the implementation of pureVirtual is not inherited by GrandChild from Child.

实际上,GrandChild 确实继承了 ChildpureVirtual()override 实现。

但是,GrandChild 也从 Brother 继承了 pureVirtual()Brother 是抽象的,因为它没有 override 它的 pureVirtual() 版本,因此 GrandChild 也是抽象的,除非它为 Brother::pureVirtual() 提供了 override 作为嗯。

您拥有经典的钻石层次结构。需要使用虚继承来解决

How does virtual inheritance solve the "diamond" (multiple inheritance) ambiguity?

Solving the Diamond Problem with Virtual Inheritance