我有4個類在多重繼承菱形方案下組織。C++多繼承(菱形方案)範例
BASE
/\
/ \
Deriv1 Deriv2
\ /
\/
Final
我已經爲每個類「ShowXXXXX」方法(例如),其中'XXXX'是類的名稱。
當我打電話 「ob.ShowFinal()
」 的方法將打印:
- 最終的領域,
- DERIV1的領域,
- 基地的領域,
- Deriv2的領域,
- 基地的領域
該pro瑕疵是,我想第二次逃脫印刷基地的領域。 但是,有一個範例:原因時,我稱之爲「ob.ShowDeriv2()
」應該印:
- Deriv2的領域,
- 基地的領域
,當我稱之爲「ob.ShowDeriv1()
」它應該是印刷:
- DERIV1的字段,
- 基地的字段
我的代碼:
// multipleInheritance.cpp : Defines the entry point for the console application.
//
//Summary:
//
// Mmb - member
// Prm - parameter
// b - Base
// i1, i2 - Intermediate1, Intermediate2
// f - final
class Base
{
int bMmb;
public:
Base(int);
void ShowBase();
};
Base::Base (int bPrm)
{
bMmb = bPrm;
}
void Base::ShowBase()
{
cout << "Showing Base fields" << endl;
cout << "bMmb = " << bMmb << endl;
cout << "----------------------------" << endl << endl;
}
class Intermediate1 : public Base
{
int i1Mmb;
public:
Intermediate1(int, int);
void ShowIntermediate1();
};
Intermediate1::Intermediate1(int bPrm, int i1Prm):Base(bPrm)
{
i1Mmb = i1Prm;
}
void Intermediate1::ShowIntermediate1()
{
cout << "Showing Intermediate1 fields" << endl;
cout << "i1Mmb = " << i1Mmb << endl;
ShowBase();
}
class Intermediate2 : public Base
{
int i2Mmb;
public:
Intermediate2(int, int);
void ShowIntermediate2();
};
Intermediate2::Intermediate2(int bPrm, int i2Prm):Base(bPrm)
{
i2Mmb = i2Prm;
}
void Intermediate2::ShowIntermediate2()
{
cout << "Showing Intermediate2 fields" << endl;
cout << "i2Mmb = " << i2Mmb << endl;
ShowBase();
}
class Final : public Intermediate1, public Intermediate2
{
int fMmb;
public:
Final(int, int, int, int);
void ShowFinal();
};
Final::Final(int bPrm, int i1Prm, int i2Prm, int fPrm): Intermediate1(bPrm, i1Prm), Intermediate2(bPrm, i2Prm)
{
fMmb = fPrm;
}
void Final::ShowFinal()
{
cout << "Showing Final fields" << endl;
cout << "fMmb = " << fMmb << endl;
ShowIntermediate1();
ShowIntermediate2();
}
void main()
{
Base t(1);
t.ShowBase();
Intermediate1 u1(2, 31);
u1.ShowIntermediate1();
Intermediate2 u2(4, 51);
u2.ShowIntermediate2();
Final v(6, 71, 72, 8);
v.ShowFinal();
}
感謝您的幫助!
您可以使用虛擬繼承來確保'Final'只有一個'BASE'子對象,而非兩個非虛擬繼承的情況。但虛擬繼承確實有成本 - 它增加了「Deriv1」和「Deriv2」子對象的大小,使用起來更加複雜。我不禁思考,但你的設計有一個更基本的問題。你究竟在做什麼?所有的'Show *()'方法都只是用於調試或者什麼? –
當你應該使用構圖時,它有點像你正在使用繼承。你能解釋一下你想用這些代碼解決什麼問題嗎? –
我應該做一個由我的教授在實驗室培訓課程上提出的工作。這是一個簡單的例子,他說:「嘗試在長菱形下進行多重繼承」 – meorfi