[英]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::FA
或B::A
解決方法:
class B: public A
這樣A
和FA
只存在於一個分支中,並且所有分支都將被定義 您可以將基類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.