C++ 基類和派生類

本講討論基類和派生類的基本概念。

通過繼續機制,可以利用已有的數據類型來定義新的數據類型。所定義的新的數據類型不僅擁有新定義的成員,而且還同時擁有舊的成員。我們稱已存在的用來派生新類的類爲基類,又稱爲父類。由已存在的類派生出的新類稱爲派生類,又稱爲子類。

在C++語言中,一個派生類可以從一個基類派生,也可以從多個基類派生。從一個基類派生的繼續稱爲單繼續;從多個基類派生的繼續稱爲多繼續。

派生類的定義格式

單繼續的定義格式如下:

class <派生類名>:<繼續方式><基類名>

{

<派生類新定義成員>

};

其中,<派生類名>是新定義的一個類的名字,它是從<基類名>中派生的,並且按指定的<繼續方式>派生的。<繼續方式>常使用如下三種要害字給予表示:

public 表示公有基類;

private 表示私有基類;

protected 表示保護基類;

多繼續的定義格式如下:

class <派生類名>:<繼續方式1><基類名1>,<繼續方式2><基類名2>,…

{

<派生類新定義成員>

};

可見,多繼續與單繼續的區別從定義格式上看,主要是多繼續的基類多于一個。

派生類的三種繼續方式

公有繼續(public)、私有繼續(private)、保護繼續(protected)是常用的三種繼續方式。

1. 公有繼續(public)

公有繼續的特點是基類的公有成員和保護成員作爲派生類的成員時,它們都保持原有的狀態,而基類的私有成員仍然是私有的。

2. 私有繼續(private)

私有繼續的特點是基類的公有成員和保護成員都作爲派生類的私有成員,並且不能被這個派生類的子類所訪問。

3. 保護繼續(protected)

保護繼續的特點是基類的所有公有成員和保護成員都成爲派生類的保護成員,並且只能被它的派生類成員函數或友元訪問,基類的私有成員仍然是私有的。

下面列出三種不同的繼續方式的基類特性和派生類特性。

不同繼續方式的基類和派生類特性

繼續方式

基類特性

派生類特性

公有繼續

public

public

protected

private

protected

不可訪問

私有繼續

public

private

protected

private

private

不可訪問

保護繼續

public

protected

protected

private

protected

不可訪問

爲了進一步理解三種不同的繼續方式在其成員的可見性方面的區別,下面從三種不同角度進行討論。

對于公有繼續方式:

(1) 基類成員對其對象的可見性:

公有成員可見,其他不可見。這裏保護成員同于私有成員。

(2) 基類成員對派生類的可見性:

公有成員和保護成員可見,而私有成員不可見。這裏保護成員同于公有成員。

(3) 基類成員對派生類對象的可見性:

公有成員可見,其他成員不可見。

所以,在公有繼續時,派生類的對象可以訪問基類中的公有成員;派生類的成員函數可以訪問基類中的公有成員和保護成員。這裏,一定要區分清楚派生類的對象和派生類中的成員函數對基類的訪問是不同的。

對于私有繼續方式:

(1) 基類成員對其對象的可見性:

公有成員可見,其他成員不可見。

(2) 基類成員對派生類的可見性:

公有成員和保護成員是可見的,而私有成員是不可見的。

(3) 基類成員對派生類對象的可見性:

所有成員都是不可見的。

所以,在私有繼續時,基類的成員只能由直接派生類訪問,而無法再往下繼續。

對于保護繼續方式:

這種繼續方式與私有繼續方式的情況相同。兩者的區別僅在于對派生類的成員而言,對基類成員有不同的可見性。

上述所說的可見性也就是可訪問性。關于可訪問性還有另的一種說法。這種規則中,稱派生類的對象對基類訪問爲水平訪問,稱派生類的派生類對基類的訪問爲垂直訪問。

一般規則如下:

公有繼續時,水平訪問和垂直訪問對基類中的公有成員不受限制;

私有繼續時,水平訪問和垂直訪問對基類中的公有成員也不能訪問;

保護繼續時,對于垂直訪問同于公有繼續,對于水平訪問同于私有繼續。

對于基類中的私有成員,只能被基類中的成員函數和友元函數所訪問,不能被其他的函數訪問。

基類與派生類的關系

任何一個類都可以派生出一個新類,派生類也可以再派生出新類,因此,基類和派生類是相對而言的。

基類與派生類之間的關系可以有如下幾種描述:

1. 派生類是基類的具體化

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

2. 派生類是基類定義的延續

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

3. 派生類是基類的組合

在多繼續時,一個派生類有多于一個的基類,這時派生類將是所有基類行爲的組合。

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

基類和派生類
本講討論基類和派生類的基本概念。 通過繼承機制,可以利用已有的數據類型來定義新的數據類型。所定義的新的數據類型不僅擁有新定義的成員,而且還同時擁有舊的成員。我們稱已存在的用來派生新類的類爲基類,又稱...查看完整版>>基類和派生類
 
C++習題與解析-繼承和派生
  6.1 分析以下程序的執行結果 #include<iostream.h> class base { public: base(){cout<<"constrUCting base class"<<endl;} ~base(){cout<<"destructing base class"<<endl; } };...查看完整版>>C++習題與解析-繼承和派生
 
C++中禁止類被派生的方法
在我的那篇“”中我說明了爲什麽作爲基類的類的析構函數必須是虛函數,同時也指出:爲了避免産生虛函數表,如果類不是基類的話,析構函數就不需要聲明爲虛函數。 但是,我們不能預料用戶的行爲,你...查看完整版>>C++中禁止類被派生的方法
 
C++學習手記(二)——類的繼承與派生
C++學習手記(二)——類的繼承與派生 陳根發 由于類與對象的存在,使得C++變得具有更強大的生命力,這也是C++産生的原因之一。但是C++面對對象的魔力...查看完整版>>C++學習手記(二)——類的繼承與派生
 
最簡單的編寫基于線程的代碼的方法之一:派生線程類
派生線程類最簡單的編寫基于線程的代碼的方法之一,就是派生Java.lang.Thread 類。該線程類是java.lang 包的一個成員,在缺省情況下,線程類可以被所有的Java應用程序調用。爲了使用線程類,我們需要了解The java.la...查看完整版>>最簡單的編寫基于線程的代碼的方法之一:派生線程類
 
派生線程類
  作者:Al Saganich 派生線程類最簡單的編寫基于線程的代碼的方法之一,就是派生Java.lang.Thread 類。該線程類是java.lang 包的一個成員,在缺省情況下,線程類可以被所有的Java應用程序調用。爲了使用線程類,我...查看完整版>>派生線程類
 
法語動詞解析詞典(動詞詞根派生法21世紀的動詞變位)|報價¥21.50|圖書,英語與其他外語,詞典與工具書,其他語詞典,張煦智
目錄:圖書,英語與其他外語,詞典與工具書,其他語詞典,品牌:張煦智基本信息·出版社:外語教學與研究出版社·ISBN:7560027083·條碼:9787560027081·版次:1·裝幀:平裝內容簡介本書介紹的方法能同時激發學生的智...查看完整版>>法語動詞解析詞典(動詞詞根派生法21世紀的動詞變位)|報價¥21.50|圖書,英語與其他外語,詞典與工具書,其他語詞典,張煦智
 
西班牙語動詞解析詞典-動詞詞根派生法|報價¥20.80|圖書,英語與其他外語,其他語言,烏爾卡德
目錄:圖書,英語與其他外語,其他語言,品牌:烏爾卡德基本信息·出版社:外語教學與研究·頁碼:216 頁碼·出版日:2007年·ISBN:7560062865·條碼:9787560062860·版次:1·裝幀:平裝·開本:0開 0開內容簡介本書...查看完整版>>西班牙語動詞解析詞典-動詞詞根派生法|報價¥20.80|圖書,英語與其他外語,其他語言,烏爾卡德
 
解決“不允許類型 System.DelegateSerializationHolder 和從中派生的類型(例如 System.DelegateSerializationHolder)在此安全級別上被反
解決“不允許類型 System.DelegateSerializationHolder 和從中派生的類型(例如 System.DelegateSerializationHolder)在此安全級別上被反序列化”錯誤的辦法。在.NET Framework 1.1中安全級別默認是Low的,...查看完整版>>解決“不允許類型 System.DelegateSerializationHolder 和從中派生的類型(例如 System.DelegateSerializationHolder)在此安全級別上被反
 
 
回到王朝網路移動版首頁