C 學習 之 繼承(筆記)

2022-08-21 02:45:13 字數 2684 閱讀 6706

繼承就像是生物裡的遺傳與變異,即派生類(子代)從基類(父代)那裡繼承基類的某些特性(遺傳),並在此基礎上擁有自己的特性(變異)。

c++派生語法:

class base//定義乙個基類

;class derived:access-specifier base//定義乙個派生類

其中access-specifier可以是public、private、protected(表示派生類有乙個基類)。

以下程式清單從fish類派生出了carp和tuna類的一種簡單的繼承層次結構:

#includeusing

namespace

std;

class fish //

定義fish類

};class tuna :public fish//

定義tuna類,將繼承的fish類的成員或方法作為自己的public成員或方法

};class carp :public

fish

};int

main()

向基類傳遞引數在初始化派生類物件時有的時候顯得很有用。比如上面的fish類派生出carp類和tuna類,可以修改成如下**:

#includeusing

namespace

std;

class

fish

public

:

void

swim()

};class tuna :public

fish

//派生類每次定義物件都指出是淡水魚還是鹹水魚,採用引數列表將bool值傳遞給基類的建構函式

};class carp :public

fish

};int

main()

如果派生類中有和基類中的函式名相同,返回值和特徵標也相同時,就相當於派生類的方法覆蓋了基類的方法。我們還拿fish類,tuna類和carp類來舉例子。

用tuna和carp類的swim()覆蓋fish類的swim():

#includeusing

namespace

std;

class

fish

public

:

void

swim()

};class tuna :public

fish

void swim()//

此函式與基類函式在呼叫上效果相同,基類函式被覆蓋

};class carp :public

fish

void

swim()

};int

main()

上面的程式的結果顯示了,在主函式中物件呼叫方法swim()時呼叫的並不是fish類裡的方法了,而是tuna和carp自己的方法,這樣基類的方法就相當於是被覆蓋了。覆蓋是的派生類的方法可以自定    義,但如果我們還想使用基類的方法,就必須想辦法使得機器可以知道我們呼叫的swim()的作用域在哪個範圍。

上面說到了我們只需要讓機器知道我們呼叫的swim()的作用域,就可以使得被覆蓋的基類方法重新被呼叫。我們可以在呼叫基類方法時使用"::"作用域解析運算子。

以上面的呼叫swim()的**為例:

mylunch.swim();//呼叫派生類carp中的swim()

my.lunch.fish::swim();//呼叫基類fish中的swim()

如果基類的方法沒有被覆蓋,則可以在派生類中和呼叫函式一樣來呼叫基類的方法。如果被覆蓋的話就要使用"::"作用域解析運算子。在主函式裡呼叫就是類似語句:"my.lunch.fish::swim();"在派   生類呼叫基類被覆蓋方法時類似於語句:"fish::swim"。

覆蓋的一種極端情形就是,tuna::swim()可能隱藏fish::swim()的所有過載版本,使得使用這些過載版本會導致編譯錯誤。

以下面**為例:

1 #include2

using

namespace

std;

3class

fish410

void swim(bool

freshwaterfish)

1118

};19

20class tuna :public

fish

2127

};28

intmain()

29

**在6-17行實現了基類方法swim的過載,在23-26行實現了派生類方法swim對基類方法swim的覆蓋。觀察發現派生類裡只有乙個版本的swim方法,fish中的swim的過載版本swim(bool)版本好像是沒   有被覆蓋,但其實swim(bool)也類似被覆蓋的情況是沒法在派生類或主函式中像呼叫其他函式那樣被呼叫的。如果我們去掉35行的注釋符號,**就會有編譯錯誤,這也說明了問題。以上說明了在派生類   中覆蓋基類的方法時是與函式的引數無關的,只要函式名稱,返回值,特徵值相同就會被覆蓋。

呼叫基類中被隱藏的方法:

解決方案1:在main函式中使用作用域解析運算子"::"。

mydinner.fish::swim();

解決方案2:在派生類中使用關鍵字using解除對基類方法的隱藏。

class tuna:public fish

}解決方案3:在tuna類中重新定義所有fish類的被覆蓋的方法的過載版本。

C 學習筆記之繼承

繼承是物件導向程式設計的三大特性之一,同時也是最重要的乙個概念。繼承允許我們根據乙個已有的類來定義另乙個類。當建立乙個新類的,只需指定新建的類繼承乙個已有的類即可。這個已有的類我們成為基類 父類 新建的類我們稱為派生類 子類 寫法 class a public b 對於派生類a來說,基類b的公有成員...

C 繼承學習筆記

派生類從基類繼承了保護 protected 成員和公有 public 成員函式,但是繼承不了基類的過載建構函式。定義乙個如下基類 class counter counter operator counter n void reset int getcount int getnum counter c...

C 學習筆記 繼承

一 c 中的繼承方式會影響子類的對外訪問屬性 public 修飾的成員變數 方法 在類的內部 類的外部都能使用 protected 修飾的成員變數方法,在類的內部使用,在繼承的子類中可用 private 修飾的成員變數方法,只能在類的內部使用 二 private成員在子類中依然存在,但是卻無法訪問到...