C++中的多重继承与虚函数

Multiple inheritance in c++ with virtual functions

我有这个代码:

class A
{
public:
   virtual void FA()=0;
};

class B: public A
{
public:
    virtual void FB()=0;
};

class Imp_A: public A
{
public:
   void FA()
   {
      // implement FA
   }
};

class Imp_B :public Imp_A, public B
{
   public:
       void FB()
       {
           // implement FB by calling FA()
           FA();
           // do some more work here.
        }
};

在 class Imp_B 中,我不想实现 FA,因为它已经在 Imp_A 中实现了,class 是基于它的。

但是当我尝试编译我的代码时,出现错误 Imp_B 是虚拟的,无法实例化。

同样,当我尝试在 FB 中调用 FA 时,我收到 FA 不明确的错误。

我该如何解决这个问题?

请注意 Imp_A 基于 A 并实现它,Imp_B 基于 Imp_A 和 B,其想法是它使用 [=29] 的 A 实现=] 并且只实现 B。

class B: public A
{
public:
    virtual FB()=0;
}

您忘记将其显式声明为 void,因此声明:

virtual int FB()=0;

并在 Imp_B 中声明:

void FB();

那当然不行。你没有覆盖任何东西。

这看起来像 classic "diamond inheritance problem",其中您在基础 class 中定义了一个虚拟方法,它被两个或多个其他 classes 继承用作多重继承的来源。

无论如何 - 虚拟继承是您问题的答案

class A
{
public:
   virtual void FA()=0;
}

class B: virtual public A
{
public:
    virtual void FB()=0; //probably a pure virtual function as well!?
}

class Imp_A: virtual public A
{
public:
   void FA()
   {
      // implement FA
   }
}

class Imp_B :public Imp_A, public B //since you call FA() you need it's implementation from Imp_A
{
   public:
       void FB()
       {
           // implement FB by calling FA()
           FA();
           // do some more work here.
        }
}

这里的问题是 Imp_b 最终来自两个 class A 定义的 FA 定义;使用虚拟继承有助于解决这个问题。

您的继承shema大致是:

   Imp_B
   /   \
Imp_A   B
  |     |
  A     A

这意味着您继承自 A 的两个不同实现。因此 Imp_A::FA 确实已定义,但 B::A 未定义,因此 class Imp_B 仍然是抽象的.它还解释了 FA 不明确的错误,因为它可能是 Imp_A::FAB::A

解决方法:

  • 您可以删除继承 class B: public A。这样 AFA 将只存在于一个分支中,并且所有将被定义
  • 你可以将基础 class A 设为虚拟,这意味着 Imp_B:

    中只会存在一个实例
    class B: virtual public A
    ...
    class Imp_A: virtual public A
    ...