C ++继承,是否只​​能拥有共享祖父级类的1个副本

时间:2012-09-25 04:44:53

标签: c++ class inheritance multiple-inheritance

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

这是一个代码示例:

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

3 个答案:

答案 0 :(得分:5)

虚拟继承是您所需要的。你的案子是一个典型的钻石问题。对谷歌或任何c ++书籍进行简短搜索应该给你足够的相关信息

答案 1 :(得分:2)

我对C ++并不多,但我知道这叫做Diamond Problem

和,this是您的解决方案。

答案 2 :(得分:0)

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