【问题标题】:C++ inheritance, is it possible to have only 1 copy of a shared grandparent classC ++继承,是否可能只有一个共享祖父母类的副本
【发布时间】:2012-09-16 13:54:00
【问题描述】:

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

这是一个代码示例:

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。这甚至可能吗?

【问题讨论】:

  • 你有没有考虑让A成为一个虚拟基地?
  • 在您的示例中,不清楚为什么 C 会从 A 派生。
  • 我知道,这有点假。

标签: c++ class inheritance multiple-inheritance


【解决方案1】:

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

【讨论】:

  • 今天学习了菱形问题和虚继承。谢谢。
【解决方案2】:

我不太喜欢 C++,但我知道这叫做 Diamond Problem

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2022-11-29
      • 2015-11-25
      • 2012-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 2010-12-06
      相关资源
      最近更新 更多