我正在嘗試完成一些學校作業,並且我剛剛注意到可能存在由於重用基類中的函數而導致的問題乘以繼承的派生類。多重繼承派生類:如何在不重複調用基地的情況下重用派生函數
比方說,我有這些類:
class A
class B: public A
class C: public A
class D: public B, public C
每個類都有這個方法:
virtual void read(ifstream& in);
在class B
和class C
,該read()
功能還呼籲class A::read()
:
void B::read(ifstream& in)
{
A::read(in);
/* read method of B*/
}
void C::read(ifstream& in)
{
A::read(in);
/* read method of C*/
}
現在,pr oblem是,當我想爲一個class D
功能read()
,我實際調用A::read()
兩次:
void D::read(ifstream& in)
{
B::read(in);
C::read(in);
/* read method of D*/
}
我知道我可以只在一個類(B
或C
)使用使用A::read()
的選項,但假設我需要在兩個課程中使用它。
這可能有助於瞭解每個實現中'read()'實際做了什麼。 –
這不是特定於繼承。如果您有獨立(非成員)函數A_read,B_read和C_read,則會發生同樣的情況。也不是在你的設計中,你可能**希望**兩次調用'A :: read',因爲你繼承了A. –
@ n.m的兩個獨立副本。好點,雖然我認爲這個問題的大多數情況都是在繼承的背景下出現的。我想象的是OP將這些類視爲純粹的接口,沒有數據成員,在這種情況下(我認爲?)是否使用虛擬繼承並不重要。我在回答中提到了這一點,但可能還不夠清楚? –