c 之繼承與派生

2021-08-05 20:31:15 字數 3142 閱讀 1378

繼承(inheritance)可以理解為乙個類從另乙個類獲取成員變數和成員函式的過程。例如類 b 繼承於類 a,那麼 b 就擁有 a 的成員變數和成員函式。被繼承的類稱為父類或基類,繼承的類稱為子類或派生類。

class 派生類名:[繼承方式] 基類名

;繼承方式限定了基類成員在派生類中的訪問許可權,包括 public(公有的)、private(私有的)和 protected(受保護的)。此項是可選項,如果不寫,預設為 private(成員變數和成員函式預設也是 private)。

現在我們知道,public、protected、private 三個關鍵字除了可以修飾類的成員,還可以指定繼承方式。

1) public繼承方式

基類中所有 public 成員在派生類中為 public 屬性;

基類中所有 protected 成員在派生類中為 protected 屬性;

基類中所有 private 成員在派生類中不能使用。

2) protected繼承方式

基類中的所有 public 成員在派生類中為 protected 屬性;

基類中的所有 protected 成員在派生類中為 protected 屬性;

基類中的所有 private 成員在派生類中不能使用。

3) private繼承方式

基類中的所有 public 成員在派生類中均為 private 屬性;

基類中的所有 protected 成員在派生類中均為 private 屬性;

基類中的所有 private 成員在派生類中不能使用。

1)子類物件在建立時會首先呼叫父類的建構函式

2)父類建構函式執行結束後,執行子類的建構函式

3)當父類的建構函式有引數時,需要在子類的初始化列表中顯示呼叫

4)析構函式呼叫的先後順序與建構函式相反

原則:   先構造父類,再構造成員變數、最後構造自己

先析構自己,在析構成員變數、最後析構父類

//先構造的物件,後釋放

#include 

using namespace std;

class object

~object()

private:

int a;};

class parent

~parent()

private:

int a;

int b;};

class child : public parent

~child()

private:

int c;

object obj1;

object obj2;};

int main()

return 0;

}

結果是先構造父類,在構造混搭obj1,obj2,在構造自己,析構正好相反

1)當子類成員變數與父類成員變數同名時

2)子類依然從父類繼承同名成員

3)在子類中通過作用域分辨符::進行同名成員區分(在派生類中使用基類的同名成員,顯式地使用類名限定符) 

4)同名成員儲存在記憶體中的不同位置

繼承和static關鍵字在一起會產生什麼現象哪?

理論知識

基類定義的靜態成員,將被所有派生類共享

根據靜態成員自身的訪問特性和派生類的繼承方式,在類層次體系中具有不同的訪問性質 (遵守派生類的訪問控制)

派生類中訪問靜態成員,用以下形式顯式說明:類名 :: 成員   或通過物件訪問   物件名 . 成員 

總結:1> static函式也遵守3個訪問原則

2> static易犯錯誤(不但要初始化,更重要的顯示的告訴編譯器分配記憶體)

多繼承宣告語法

class  派生類名 : 訪問控制  基類名1 ,  訪問控制  基類名2 ,  … , 訪問控制  基類名n

;類 c 可以根據訪問控制同時繼承類 a 和類 b 的成員,並新增自己的成員

多個基類的派生類建構函式可以用初始式呼叫基類建構函式初始化資料成員

執行順序與單繼承建構函式情況類似。多個直接基類建構函式執行順序取決於定義派生類時指定的各個繼承基類的順序。

乙個派生類物件擁有多個直接或間接基類的成員。不同名成員訪問不會出現二義性。如果不同的基類有同名成員,派生類物件訪問時應該加以識別。

如果乙個派生類從多個基類派生,而這些基類又有乙個共同的基類,則在對該基類中宣告的名字進行訪問時,可能產生二義性

如果在多條繼承路徑上有乙個公共的基類,那麼在繼承路徑的某處匯合點,這個公共基類就會在派生類的物件中產生多個基類子物件

要使這個公共基類在派生類中只產生乙個子物件,必須對這個基類宣告為虛繼承,使這個基類成為虛基類。

虛繼承宣告使用關鍵字       virtual

類其實也是一種資料型別,也可以發生資料型別轉換,不過這種轉換只有在基類和派生類之間才有意義,並且只能將派生類賦值給基類,包括將派生類物件賦值給基類物件、將派生類指標賦值給基類指標、將派生類引用賦值給基類引用,這在 c++ 中稱為向上轉型(upcasting)。相應地,將基類賦值給派生類稱為向下(downcasting)。

向上轉型非常安全,可以由編譯器自動完成;向下轉型有風險,需要程式設計師手動干預。

型別相容規則是指在需要基類物件的任何地方,都可以使用公有派生類的物件來替代。通過公有繼承,派生類得到了基類中除建構函式、析構函式之外的所有成員。這樣,公有派生類實際就具備了基類的所有功能,凡是基類能解決的問題,公有派生類都可以解決。

型別相容規則中所指的替代包括以下情況:

子類物件可以當作父類物件使用

子類物件可以直接賦值給父類物件

子類物件可以直接初始化父類物件

父類指標可以直接指向子類物件

父類引用可以直接引用子類物件

在替代之後,派生類物件就可以作為基類的物件使用,但是只能使用從基類繼承的成員。

型別相容規則是多型性的重要基礎之一。

1繼承是物件導向程式設計實現軟體重用的重要方法。程式設計師可以在已有基類的基礎上定義新的派生類。

2 單繼承的派生類只有乙個基類。多繼承的派生類有多個基類。

3 派生類對基類成員的訪問由繼承方式和成員性質決定。

4建立派生類物件時,先呼叫基類建構函式初始化派生類中的基類成員。呼叫析構函式的次序和呼叫建構函式的次序相反。

5 c++提供虛繼承機制,防止類繼承關係中成員訪問的二義性。

6 多繼承提供了軟體重用的強大功能,也增加了程式的複雜性。

c 之繼承與派生

再來回顧下繼承派生的語法。繼承方式顯示有三種 public,protected,privatez 隱式預設private。所謂繼承方式,是指派生類對基類成員的訪問許可權控制。派生類建構函式定義的一般格式如下 派生類名 引數總表 基類名1 參數列1 基類名m 參數列m 成員物件名1 成員物件參數列1 ...

C 繼承與派生

派生新類 吸收已有類的成員 調整已有類成員和新增新的成員 class 派生類名 繼承方式 基類名1,繼承方式 基類名2,派生類成員宣告 繼承方式有 public protected private 預設 公有繼承 基類的公有和保護乘員的訪問屬性在派生類中不變,基類的私有成員不能直接訪問 型別相容規則...

c 繼承與派生

繼承 與派生 一 派生方式的不同的表現 1 派生類在類內成員對基類成員 的訪問許可權 2 派生類的物件對基類成員的訪問許可權。二 公有繼承 1 基類protected和public的成員在派生類中訪問屬性保持不變 2 基類的private成員在派生類中不可訪問。3 派生類的成員 即派生類內 可以直接...