带有虚函数的c ++中的多重继承

时间:2016-03-01 13:24:45

标签: 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:
       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.

3 个答案:

答案 0 :(得分:2)

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

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

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;使用虚拟继承有助于解决这个问题。

答案 1 :(得分:2)

你的遗产谢谢或多或少:

   Imp_B
   /   \
Imp_A   B
  |     |
  A     A

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

解决方法:

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

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

答案 2 :(得分:1)

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

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

virtual int FB()=0;

Imp_B中你声明:

void FB();

当然,这不起作用。你没有覆盖任何东西。