C++ 中具有虚函数的多重继承

Multiple inheritance in c++ with virtual functions

本文关键字:函数 多重继承 C++      更新时间:2023-10-16

我有这个代码:

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.
        }
};

在类 Imp_B 中,我不想实现 FA,因为它已经在该类所基于的Imp_A中实现。

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

此外,当我尝试在FB内部调用FA时,我收到FA模棱两可的错误。

如何解决这个问题?

请注意,Imp_A 基于 A 并实现它,

Imp_B 基于 Imp_A 和 B,其想法是它使用 imp_A 的 A 实现并且只实现 B。

看起来像经典的"钻石继承问题",其中您在基类中定义了一个虚拟方法,该基类由两个或多个用作多重继承源的其他类继承。

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

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最终得到来自两个 A 类定义的 FA;使用虚拟继承有助于解决这个问题。

你的继承或多或少是:

   Imp_B
   /   
Imp_A   B
  |     |
  A     A

这意味着您继承了 A 的两个不同实现。所以Imp_A::FA确实被定义了,但B::A没有,所以类Imp_B仍然是抽象的。这也解释了FA模棱两可的错误,因为它可能是Imp_A::FA的,也可能是B::A的。

解决方法:

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

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

你忘了明确声明这是void,所以这声明:

virtual int FB()=0;

Imp_B中,您声明:

void FB();

当然,这是行不通的。你没有覆盖那里的任何东西。