7

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

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 没有定义)

4

5 回答 5

1

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

于 2012-04-10T06:57:04.723 回答
1

执行A哪些委托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

class C: public A, private virtual A_Impl
{
};
于 2012-04-10T08:00:46.413 回答
0

您可以执行以下操作:

void C::f() {
    B* b = this;
    b->f();
}
于 2012-04-10T05:52:51.297 回答
0

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

于 2012-04-10T06:27:19.557 回答
-1

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

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

于 2012-04-10T08:25:35.463 回答