使用姐妹继承

时间:2012-04-10 05:39:50

标签: c++ inheritance multiple-inheritance virtual-inheritance

让我们假设一些(遗留)代码,无法触及,声明

struct B{
 public:
  void f(){}
};

让我们假设有

struct A{
 public:
  virtual void f()=0;
};

是否可以在不显式调用f()的情况下调用A子类调用B :: f,即代替

  struct C: public A, public B{
   void f(){
   B::f();
  }
 };

有像

这样的东西
 struct C:virtual public A,virtual public B{

 };

(请注意,最后一个类是抽象的,因为编译器A :: f未定义)

5 个答案:

答案 0 :(得分:1)

直接在C ++中,不可能基于B函数与A的隐式匹配来进行多态分派。您可以使用gccxml或其他类似产品来进行某种代码生成,但如果只有一百个函数,宏可以减少转发到单行程 - 除非您有成千上万的工具,否则不值得引入额外的工具这些要做。

答案 1 :(得分:1)

实施代理A的{​​{1}}:

B

通过派生class A_Impl : public A { public: virtual void f() { b.f(); } private: B b; }

来实施C
A_Impl

或者,如果您只想在继承层次结构中显示class C: public A_Impl { }; ,请从A公开派生,并从A私下派生:

A_Impl

答案 2 :(得分:0)

您可以执行以下操作:

void C::f() {
    B* b = this;
    b->f();
}

答案 3 :(得分:0)

不,你不能这样做。从您向我们展示的片段看来,B应该是C的成员,而不是继承。您只需编写一些转发函数(或自动为您生成它们的脚本)。

答案 4 :(得分:-1)

所以,你在A中有100个纯虚函数,B中那些函数的实现,你想避免在C中重写所有这些函数来调用B.没有办法让编译器使用B的实现自动。而不是与编译器斗争(你每次都会失败!),重新考虑继承图。也许使B成为A的子类,然后从B派生出来。或者将B中的100个方法分解为A的具体子类。

编程是在工具提供的约束内解决问题的艺术。当您发现自己与工具不一致时,您需要重新考虑解决问题的方法或使用不同的工具。