C 學習記錄 二 實現繼承

2021-09-29 15:53:50 字數 2937 閱讀 3972

物件導向程式設計基於四個重要方面:封裝、抽象、繼承和多型。繼承是一種強大的屬性重用方式,是通向多型的跳板。

這章中將學習:

程式設計意義上的繼承;

c++繼承語法;

公有繼承、私有繼承和保護繼承;

多繼承;

隱藏基類方法和切除(slicing)導致的問題。

在程式設計領域,經常會遇到具有類似屬性,但細節或行為存在細微差異的元件。在這中情況下,一種解決之道是將每個元件宣告為乙個類,並在每個類中實現所有屬性,這將重複實現相同的屬性。另一種解決辦法是繼承,從同乙個基類派生出類似的類,在基類實現所有通用的功能,並在派生類中覆蓋基本功能,以實現讓每個類都獨一無二。第二種方法更好。物件導向程式設計支援繼承。看下圖:

上面的圖說明了基類與派生之間的關係。派生類繼承了基類。

如何從fish類派生出carp類呢?c++派生語法如下:

//declaring a super class

class base

;//declaring a sub-class

class derived:access-specifer base

;

其中access-specifier可以使public(這是最常見的,表示派生類是乙個基類)、private或protected(表示派生類有乙個基類)。

下面的繼承結構表明,carp類是從fish類派生而來的:

class fish

;class carp:public fish

;

基類也稱為超類,從基類派生而來的類稱為派生類,也叫子類。

#include using namspace std;

class fish

};class derived:public base

};

對於fish類來說,這種機制很有用。通過給fish的建構函式提供乙個布林引數,以初始化fish::reshwaterfish,可以強制每個派生類都指出它自己是淡水魚還是海水魚,**如下:

#include using namespace std;

class fish

void swim()

};class derived:public base

};

因此,如果使用derived類的例項呼叫方法dosomething(),呼叫的將不是base類中的這個方法。

如果tuna和carp中實現了自己的swim()方法,則相當於覆蓋了基類中的swim()方法。看下面的程式:

#include using namespace std;

class fish

void swim()

void swim()

void swim()

void swim()

;class derived:private base

;

私有繼承意味著在派生類的例項中,基類的所有成員和方法都是私有的——不能從外部訪問。換句話說,即便是base類的公有成員和方法,也只能被derived類使用,無法通過derived例項來使用它們。

私有繼承使得只有子類才能使用基類的屬性和方法。

#include using namespace std;

class motor

;class derived: protected base

;

保護繼承與私有繼承的類似之處如下:

隨著繼承層次結構的加深,保護繼承與私有繼承有些不同:

class derived2:protected derived

;

在保護繼承層次中,子類的子類(即derived2)能夠訪問base類的公有成員。但如果derived和base之間的繼承關係是私有的,就不能這樣做。

#include using namespace std;

class motor

};

這是一種不錯的設計,可以輕鬆地在car類中新增motor成員,而無需改變繼承層次結構,也不用修改客戶看到的設計。

如果這樣做,結果會如何?

derived objectderived;

base objectbase = objectderived;

如果這樣做,結果又會如何?

void funcusebase(base input);

...derived objectderived;

funcusebase(objectderived);

它們都將derived物件複製給base物件,乙個是通過顯式複製,另乙個是通過傳遞引數。在這些情境下,編譯器將只複製objectderived的base部分,即不是整個物件,而是base容納的部分,這通常不是程式設計師本意,這種無意間的剪裁資料,導致derived變成base的行為稱為切除。

警告;要避免切除問題,不要按值傳遞引數,而硬以指向基類的指標或const引用的方式傳遞。

c++允許繼承多個類

class derived:access-specifier base1,access-specifier base2

;

我們直接看**吧

#include using namespace std;

class mammal

{public:

void feedbabymilk()

{cout<

務必牢記,私有繼承意味著繼承派生類的類也不能訪問基類的成員。

務必牢記,保護繼承意味著派生繼承類的類能夠訪問基類的公有和保護方法。

務必牢記,無論繼承關係是什麼,派生類都不能訪問基類的私有成員。

C 學習記錄 繼承

繼承是物件導向的三大特性之一。class 子類 繼承方式 父類 從父類繼承來的表現其共性,而新增的成員表現其個性。三種繼承方式 問題 從父類繼承來的成員,哪些屬於子類物件中?輸出子類的sizeof可以看出,父類中的所有非靜態成員都會被子類繼承下去,無論哪種繼承方式。構造 先base後son 析構 恰...

c 繼承(學習記錄三)

class 派生類名 public 基類名 多重繼承宣告格式 class 派生類名 public1 基類名1,public2 基類名2,class cpoint class ccircle class base class derived public base base b derived d 派...

c 學習(二)繼承

當建立乙個類時,不需要重新編寫新的資料成員和成員函式,只需指定新建的類繼承了乙個已有的類的成員即可。這個已有的類稱為基類,新建的類稱為派生類。其中,整合通過 來進行繼承,繼承包括protect,public,provite三種繼承,其中三種區別如下 訪問public protected privat...