簡體   English   中英

帶有虛函數的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.
        }
};

在類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::FAB::A

解決方法:

  • 你可以刪除繼承class B: public A 這樣AFA只存在於一個分支中,並且所有分支都將被定義
  • 您可以將基類A Imp_B虛擬,這意味着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();

當然,這不起作用。 你沒有覆蓋任何東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM