專-C++繼承

C++繼承
編輯


通過繼承機制,可以利用已有的數據類型來定義新的數據類型。所定義的新的數據類型不僅擁有新定義的成員,而且還同時擁有舊的成員。我們稱已存在的用來派生新類的類爲基類,又稱爲父類。由已存在的類派生出的新類稱爲派生類,又稱爲子類。
目錄
1簡介
2繼承方式
公有方式
私有方式
保護方式
3一般規則
4兩類關係
具體化
延續化
派生類
5成員調整
控制方式
重定義
1簡介


在C++語言中,一個派生類可以從一個基類派生,也可以從多個基類派生。從一個基類派生的繼承稱爲單繼承;從多個基類派生的繼承稱爲多繼承。
派生類的定義格式
單繼承的定義格式如下:
class <派生類名>:<繼承方式><基類名>
{
<派生類新定義成員>
};
其中,class是關鍵詞,<派生類名>是新定義的一個類的名字,它是從<基類名>中派生的,並且按指定的<繼承方式>派生的。<繼承方式>常使用如下三種關鍵字給予表示:
public 表示公有基類;
private 表示私有基類;
protected 表示保護基類;
多繼承的定義格式如下:
class <派生類名>:<繼承方式1><基類名1>,<繼承方式2><基類名2>,…
{
<派生類新定義成員>
};
可見,多繼承與單繼承的區別從定義格式上看,主要是多繼承的基類多於一個。
如果省略繼承方式,對'class'將採用私有繼承,對'struct'將採用公有繼承。
也就是說
class Base1{};
struct Base2{};
class Derive:Base1,Base2{};
那麼,Derive類將私有繼承Base1,公有繼承Base2。相當於:
class Derive:private Base1,public Base2{};
2繼承方式


公有繼承(public)、私有繼承(private)、保護繼承(protected)是常用的三種繼承方式。
1. 公有繼承(public)
公有繼承的特點是基類的公有成員和保護成員作爲派生類的成員時,它們都保持原有的狀態,而基類的私有成員仍然是私有的,不能被這個派生類的子類所訪問。
2. 私有繼承(private)
私有繼承的特點是基類的公有成員和保護成員都作爲派生類的私有成員,並且不能被這個派生類的子類所訪問。
3. 保護繼承(protected)
保護繼承的特點是基類的所有公有成員和保護成員都成爲派生類的保護成員,並且只能被它的派生類成員函數或友元訪問,基類的私有成員仍然是私有的。
下面列出三種不同的繼承方式的基類特性和派生類特性。


public
protected
private
公有繼承
public
protected
不可見
私有繼承
private
private
不可見
保護繼承
protected
protected
不可見
爲了進一步理解三種不同的繼承方式在其成員的可見性方面的區別,下面從三種不同角度進行討論。
公有方式


(1) 基類成員對其對象的可見性:
公有成員可見,其他不可見。這裏保護成員同於私有成員。
(2) 基類成員對派生類的可見性:
公有成員和保護成員可見,而私有成員不可見。這裏保護成員同於公有成員。
(3) 基類成員對派生類對象的可見性:
公有成員可見,其他成員不可見。
所以,在公有繼承時,派生類的對象可以訪問基類中的公有成員;派生類的成員函數可以訪問基類中的公有成員和保護成員。這裏,一定要區分清楚派生類的對象和派生類中的成員函數對基類的訪問是不同的。
私有方式


(1) 基類成員對其對象的可見性:
公有成員可見,其他成員不可見。
(2) 基類成員對派生類的可見性:
公有成員和保護成員是可見的,而私有成員是不可見的。
(3) 基類成員對派生類對象的可見性:
所有成員都是不可見的。
所以,在私有繼承時,基類的成員只能由派生類中的成員函數訪問,而且無法再往下繼承。
保護方式


這種繼承方式與私有繼承方式的情況相同。兩者的區別僅在於對派生類的成員而言,對基類成員有不同的可見性。
上述所說的可見性也就是可訪問性。關於可訪問性還有另的一種說法。這種規則中,稱派生類的對象對基類訪問爲水平訪問,稱派生類的派生類對基類的訪問爲垂直訪問。
3一般規則


公有繼承時,水平訪問和垂直訪問對基類中的公有成員不受限制;
私有繼承時,水平訪問和垂直訪問對基類中的公有成員也不能訪問;
保護繼承時,對於垂直訪問同於公有繼承,對於水平訪問同於私有繼承。
對於基類中的私有成員,只能被基類中的成員函數和友元函數所訪問,不能被其他的函數訪問。
基類與派生類的關係
任何一個類都可以派生出一個新類,派生類也可以再派生出新類,因此,基類和派生類是相對而言的。
4兩類關係


具體化


類的層次通常反映了客觀世界中某種真實的模型。在這種情況下,不難看出:基類是對若干個派生類的抽象,而派生類是基類的具體化。基類抽取了它的派生類的公共特徵,而派生類通過增加行爲將抽象類變爲某種有用的類型。
延續化


先定義一個抽象基類,該基類中有些操作並未實現。然後定義非抽象的派生類,實現抽象基類中定義的操作。例如,虛函數就屬此類情況。這時,派生類是抽象的基類的實現,即可看成是基類定義的延續。這也是派生類的一種常用方法。
派生類


在多繼承時,一個派生類有多於一個的基類,這時派生類將是所有基類行爲的組合。
派生類將其本身與基類區別開來的方法是添加數據成員和成員函數。因此,繼承的機制將使得在創建新類時,只需說明新類與已有類的區別,從而大量原有的程序代碼都可以複用,所以有人稱類是“可複用的軟件構件”。
5成員調整


控制方式


訪問聲明採用作用域"::" ,它的一般形式爲:基類名::成員名;。在派生類的類界面中,將這些訪問聲明放在合適的訪問控制保留字之後,從而改變在派生類中該成員的訪問控制方式。
重定義


如果在派生類中定義了一個函數原型與繼承成員函數一模一樣的成員函數,則該函數實現的函數體是對繼承成員函數的重定義。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章