第10章 類的繼承與組合
對象(Object)是類(Class)的一個(gè)實(shí)例(Instance)。如果將對象比作房子,那么類就是房子的設(shè)計(jì)圖紙。所以面向?qū)ο笤O(shè)計(jì)的重點(diǎn)是類的設(shè)計(jì),而不是對象的設(shè)計(jì)。 對于C++程序而言,設(shè)計(jì)孤立的類是比較容易的,難的是正確設(shè)計(jì)基類及其派生類。本章僅僅論述“繼承”(Inheritance)和“組合”(Composition)的概念。
注意,當(dāng)前面向?qū)ο蠹夹g(shù)的應(yīng)用熱點(diǎn)是COM和CORBA,這些內(nèi)容超出了C++教材的范疇,請閱讀COM和CORBA相關(guān)論著。
10.1 繼承 如果A是基類,B是A的派生類,那么B將繼承A的數(shù)據(jù)和函數(shù)。例如:
class A
{
public:
void Func1(void);
void Func2(void);
};
class B : public A
{
public:
void Func3(void);
void Func4(void);
};
main()
{
B b;
b.Func1(); // B從A繼承了函數(shù)Func1
b.Func2(); // B從A繼承了函數(shù)Func2
b.Func3();
b.Func4();
}
這個(gè)簡單的示例程序說明了一個(gè)事實(shí):C++的“繼承”特性可以提高程序的可復(fù)用性。正因?yàn)椤袄^承”太有用、太容易用,才要防止亂用“繼承”。我們應(yīng)當(dāng)給“繼承”立一些使用規(guī)則。
l 【規(guī)則10-1-1】如果類A和類B毫不相關(guān),不可以為了使B的功能更多些而讓B繼承A的功能和屬性。不要覺得“白吃白不吃”,讓一個(gè)好端端的健壯青年無緣無故地吃人參補(bǔ)身體。
l 【規(guī)則10-1-2】若在邏輯上B是A的“一種”(a kind of ),則允許B繼承A的功能和屬性。例如男人(Man)是人(Human)的一種,男孩(Boy)是男人的一種。那么類Man可以從類Human派生,類Boy可以從類Man派生。
class Human
{
…
};
class Man : public Human
{
…
};
class Boy : public Man
{
…
};
u 注意事項(xiàng)
【規(guī)則10-1-2】看起來很簡單,但是實(shí)際應(yīng)用時(shí)可能會(huì)有意外,繼承的概念在程序世界與現(xiàn)實(shí)世界并不完全相同。
例如從生物學(xué)角度講,鴕鳥(Ostrich)是鳥(Bird)的一種,按理說類Ostrich應(yīng)該可以從類Bird派生。但是鴕鳥不能飛,那么Ostrich::Fly是什么東西?
class Bird
{
public:
virtual void Fly(void);
…
};
class Ostrich : public Bird
{
…
};
例如從數(shù)學(xué)角度講,圓(Circle)是一種特殊的橢圓(Ellipse),按理說類Circle應(yīng)該可以從類Ellipse派生。但是橢圓有長軸和短軸,如果圓繼承了橢圓的長軸和短軸,豈非畫蛇添足?
所以更加嚴(yán)格的繼承規(guī)則應(yīng)當(dāng)是:若在邏輯上B是A的“一種”,并且A的所有功能和屬性對B而言都有意義,則允許B繼承A的功能和屬性。
[1] [2] 下一頁
|