.基類和派生類關系
任何一個類都有可以派生出上個新類,派生類也可以再派生出新類,是以,基類和派生類是相對而言的。一個基類可以是另一個基類的派生類,這樣便形成了複雜的繼承結構,出現了類的層次。一個基類派生出一個派生類,它又做另一個派生類的基類,則原來基類為該派生類的間接基類。
基類與派生類之間的關系可以有如下幾種描述:
1 派生類是基類的具體化
類的層次通常反映了客觀世界中某種真實的模型。例如,定義輸入裝置為基類,而鍵盤、滑鼠器和數字化闆将是派生類,它們關系如圖6-3所示,在這種情況下,不難看出:基類是對若于個派生類的抽象,而派生類是基類的具體化。基類抽取了它的派生類的公共牲,而派生類通過增加行為将抽象類變為某種有用的類型。
2 派生類是基類定義的延續
先定義一個抽象基類,該基類中有些操作并未實作。然後定義非抽象的派生類,實作抽象基類中定義的操作。例如,虛函數就屬此類情況。這時,派生類是抽象的基類的實作,即可看成是基類定義的延續。這也是派生類的一種常用的方法。
3 派生類是基類的組合
在多繼承時,一個派生類有多于一個的基類,這時派生類将是所有基類行為的組合。如上述派生類風扇台燈類就是基類風扇類和台燈類的組合。
例題6-1
下面定義了一個關于交通工具的類
class vehicle
{
int wheels; //輪子數
float weight; //重量
public:
void initialize(int in_wheels, float in_weight);
int get_wheels( ) {return wheels;}
float get_weight( ) {return weight;}
float wheel_loading( ) {return weight/wheels;}
};
如果要再定義一個小轎車的類和一個卡車的類,如何實作呢?這裡我們就要用到面向對象程式設計的另一個機制--繼承。現實世界的物質多種多樣,但許多物質都存在着層次關系,這種層次結構是我們找到了描述事物的解決方法。
下面通過繼承來派生出小汽車和卡車的類。
//小汽車的類
class car : public vehicle
{
int passenger_load; //載客數
public:
void initialize(int in_wheels, float in_weight, int people = 4);
int passengers( ) {return passenger_load;}
};
//卡車的類
class truck : public vehicle
{
int passenger_load; //載客數
float payload; //有效負載
public:
void init_truck(int how_many = 2, float max_load = 24000.0);
float efficiency( ); //馬力
int passengers( ) {return passenger_load;}
};
說明:上面通過繼承從類vehicle中派生出了car和truck兩個類。我們把vehicle稱為基類,把car和truck稱為派生類或子類