使用姐妹继承

using sister inheritance

本文关键字:继承 姐妹      更新时间:2023-10-16

让我们假设一些(遗留的)代码,不能被触及,声明

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 未定义)

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

实现委托给BA

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

通过从A_Impl派生来实现C

class C: public A_Impl
{
};

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

class C: public A, private virtual A_Impl
{
};

你可以做这样的事情:

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

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

因此,你在 A 中有 100 个纯虚函数,在 B 中有这些函数的实现,并且您希望避免在 C 中编写重新实现所有这些函数来调用 B。没有办法让编译器自动使用 B 的实现。与其与编译器争吵(你每次都会输!),不如重新考虑继承图。也许使 B 成为 A 的子类,然后从 B 导出 C。或者将 B 中的 100 个方法分解为 A 的具体子类。

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