C++继承,是否可以只有共享祖父类的 1 个副本

C++ inheritance, is it possible to have only 1 copy of a shared grandparent class

本文关键字:父类 副本 共享 继承 是否 C++      更新时间:2023-10-16

我有一个项目,其中包含一些非常小的类,这些类充当较大类的最小接口。 有时我有一些对象需要其中几个接口。 有时这些接口共享相同的派生基类。 无论如何,我可以构建我的代码,以便我只有所有接口共享的派生基类的一个副本?

下面是一个代码示例:

class A {
public:
  virtual void f(int a)=0;
  virtual int g() const {
    return m_inner;
  }
protected:
  int m_inner;
};
class B : public A {
public:
  virtual void f(int a)=0;
  virtual void h(int b) {
    m_stuff = b;
    m_inner = 0;
  }
protected:
  int m_stuff;
};
class C : public A {
public:
  virtual void f(int a)=0;
  virtual int i() const {
    return m_otherstuff;
  }
protected:
  int m_otherstuff;
};
class D : public B, public C {
public:
  void f(int a) { //do stuff }
  //fill in the rest of a big actual class.
}; 

D 有两个 A 副本,引用 A:: 是不明确的。 构建我的课程以使我在一天结束时只获得一份 A 副本的最佳方法是什么? 我愿意以任何方式重组A,B和C。 这可能吗?

虚拟继承是你需要的。您的案例是典型的钻石问题。在谷歌或任何C ++书籍上进行简短搜索应该会给你很多相关信息

我不太喜欢C++但我知道这被称为钻石问题。

而且,这是您的解决方案。

虚拟继承将解决您的直接问题(已经在这里回答了)。但是,我强烈建议您重新考虑层次结构。我从未见过虚拟继承的使用,除非在学术论文和一些极端重构的情况下。也许,您可以通过使用聚合而不是继承来摆脱困境。