c++ 两个派生类的多重继承

我有一个抽象基类作为一个接口.

我有两个派生类的“集合”,它们实现了抽象类的一半. (一个“set”定义与初始化相关的抽象虚拟方法,另一个“set”定义与实际“工作”相关的那些).

然后我派生了使用多个继承构造完全定义的类(并且不添加任何内容)的类.

所以:(坏的伪代码)

class AbsBase {
  virtual void init() = 0;
  virtual void work() = 0;
}

class AbsInit : public AbsBase {
  void init() { do_this(); }
  // work() still abs
}

class AbsWork : public AbsBase {
  void work() { do_this(); }
  // init() still abs
}

class NotAbsTotal : public AbsInit, public AbsWork {
  // Nothing, both should be defined
}

首先我可以这样做吗?我可以从两个派生自同一个Base的类继承吗? (但愿如此).

这是“真正的问题”,虽然(我说谎了一点以简化的例子).

我真正去做的是将非抽象访问器方法添加到基类中:

class AbsBase {
public:
  void init() { init_impl(); }
  void work() { work_impl(); }

private:
  virtual void init_impl() = 0;
  virtual void work_impl() = 0;
}

因为一个常见的成语是让所有的虚拟方法都是私有的.

不幸的是,现在AbsInit和AbsWork都继承了这些方法,所以NotAbsTotal继承了“每个两个”(我意识到我可能是在编译时真正发生的事情).

无论如何,g抱怨说:“尝试使用该类时,请求成员init()是模糊的”.

我假设,如果我使用我的AbsBase类作为纯粹的接口,这将被避免(假设上面的例子是有效的).

所以:
我可以跟我执行吗?
– 这是将虚拟方法私有化的成语的限制吗?
– 如何重构我的代码做我想要的(提供一个公共接口,但允许一种方法来交换成员函数“集”的实现)

编辑:

看来我不是第一个:
http://en.wikipedia.org/wiki/Diamond_problem

似乎虚拟继承是这里的解决方案.以前我听说过虚拟的继承,但是我并没有把头包围.我仍然乐意提出建议.

看起来你想做虚拟继承.是否实际上是一个好主意是另一个问题,但这里是你如何做的:


class AbsBase {...};
class AbsInit: public virtual AbsBase {...};
class AbsWork: public virtual AbsBase {...};
class NotAbsTotal: public AbsInit, public AbsWork {...};

基本上,默认的非虚拟多重继承将包含派生类中每个基类的副本,并包括其所有方法.这就是为什么你有两个AbsBase的副本 – 你的方法使用的原因是模糊的是两个方法都被加载,所以C无法知道哪个副本可以访问!

虚拟继承将对虚拟基类的所有引用都聚合到一个数据结构中.这应该使基类的方法再次明确.但是,请注意:如果两个中间类中有额外的数据,则可能会有一些小的额外的运行时开销,以使代码能够找到共享的虚拟基类.

http://stackoverflow.com/questions/254673/multiple-inheritance-from-two-derived-classes

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c++ 两个派生类的多重继承