C++ c+中的多重继承+;具有虚拟功能

C++ c+中的多重继承+;具有虚拟功能,c++,multiple-inheritance,virtual-functions,C++,Multiple Inheritance,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: vo

我有以下代码:

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 B: public A
{
public:
    virtual FB()=0;
}
您忘记将其显式声明为
void
,因此声明:

virtual int FB()=0;
并在
Imp_B
中声明:

void FB();

那当然不行。您没有覆盖任何内容。

这看起来像是经典的“菱形继承问题”,在基类中定义了一个虚拟方法,该基类由两个或多个其他类继承,这些类用作多重继承的源

无论如何,虚拟继承是解决您问题的答案

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的to定义;使用虚拟继承有助于解决此问题。

您的继承shema或多或少:

   Imp_B
   /   \
Imp_A   B
  |     |
  A     A
这意味着您继承了A的两个不同实现。因此确实定义了
Imp_A::FA
,但
B::A
没有定义,因此类
Imp_B
仍然是抽象的。它还解释了FA不明确的错误,因为它可以是
Imp_A::FA
B::A

解决方法:

  • 您可以删除继承
    类B:public A
    。这样,
    A
    FA
    将只存在于一个分支中,并且所有分支都将被定义
  • 您可以将基类
    A
    设置为虚拟,这意味着
    Imp\u B
    中只存在一个实例:

    class B: virtual public A
    ...
    class Imp_A: virtual public A
    ...
    

您得到的引用不明确,因为它不知道是使用class
A
还是
imp\u A
。为了解决这个问题,您需要在它前面加上您想要从中实现它的基类,所以如果您想使用类A,那么您可以将
A::FA
。不能实例化虚拟方法,但可以覆盖它们,因此需要指定覆盖该方法。我还没有使用C++,所以我记不住确切的语法(因此我为什么要评论而不是回答)。由于FA是在Imp_A中实现的,为什么我不能实例化Imp_B?@mtk99这不是该问题的重复,因为这里Imp_A基于A,并且在该问题上实现与虚拟类没有关系。您是对的,抱歉,实际错误是调用
FA()不明确(无法决定通过
B
来的
A::FA
和通过
Imp\u A
来的
A::FA
)。“Imp_B是虚拟的,无法实例化”是一个应该忽略的级联(发生这种情况是因为
FA();
无法编译意味着
FB(){……}
没有编译,因此该类没有被认为覆盖了纯虚拟定义)对不起,这是代码中的类型错误,我拥有的原始代码在实现和接口上都是无效的。谢谢,这并没有解决问题:你是说虚拟公共imp_A?即使这样也没有解决问题。我仍然得到同样的错误。好吧,我在这里编译了它:它编译得很好;请注意,您的原始代码中有一个输入错误FB()需要一个返回类型。我认为您还需要
类Imp\u a:virtual public a
,以及
类Imp\u B:public Imp\u a
。基本上,所有继承A的东西都需要虚拟地继承它。@Pandrei你能在cpp.sh上分享你的代码吗,这样我就可以用我的实现来检查它了?@MartinBonner;不是你不Imp_A不用于多重继承,Imp_B不需要从Imp_A继承,它已经有两个来自A和B的A类定义,另一个解决方案是明确指出
Imp_A::FA()
(或者
B::FA()
,如果其中一个有主体的话)@M.M:你在FB中调用FA是正确的,但这并不能解决Imp_B仍然是抽象的问题,除非它明确地覆盖B::FB不确定您在说什么,
void FB()
in
Imp_B
覆盖
virtual void FB()=0
B