C 繼承與多型詳解

2021-10-08 12:45:35 字數 3124 閱讀 4991

一、前言

c++提供了比修改**更好的方法來擴充套件和修改類,這種方法叫做類繼承,它能夠從已有的類中派生出新的類,通過繼承派生出的類通常比設計新類要容易的多,下面是可以通過 繼承完成的一些工作:

二、繼承解釋

繼承是類的重要特性。a類繼承b類,我稱b類為「基類」,a為「子類」或者「派生類」。派生類繼承了基類之後,派生類就具有了基類的部分成員,具體得到了那些成員,這得由兩個方面決定:

三、需要在派生類中 新增什麼呢?

class

ratedplayer

:public tabletennisplayer

;

建構函式必須給新成員(如果有的話)和繼承的成員提供資料,在第乙個建構函式中,每乙個成員對應乙個形參,第二個建構函式中使用乙個tabletennisplayer引數,該引數包括firstname,lastname和hastable。

四、建構函式:訪問許可權

派生類不能直接訪問基類的私有成員,而必須通過基類的方法進行訪問,具體的說,派生類建構函式必須使用基類建構函式。

下面是第乙個建構函式的**:

//tabletennisplayer是基類,ratedplayer是派生類

ratedplayer::

ratedplayer

(unsigned

int r,

const string &fn,

const string &ln,

bool ht)

:tabletennisplayer

(fn, ln, ht)

其中:tabletinnesplayer(fn, ln,ht)是成員初始化列表,它是可執行的**,呼叫tabletinnesplayer的建構函式,例如,假設程式包含如下宣告:

retedplayer rplayer1(1140, 「mallory」, 「duck」, true);

則reateplayer建構函式把實參「mallory」,「duck」和true賦給形參fn,ln和ht,然後將這些引數作為實參傳遞給tabletennisplayer建構函式,後者將建立乙個巢狀tabletannisplayer物件,並將資料 「mallory」,「duck」和true儲存在該物件中,然後,程式進入retedplarly建構函式體,完成retedplarly物件的建立,並將引數r的值賦值給成員rating。

如果不呼叫基類建構函式,程式講使用預設的基類建構函式,除非要使用預設建構函式,否則應顯式呼叫正確的基類建構函式

下面是第二個建構函式的**:

ratedplayer::

ratedplayer

(unsigned

int r,

const tabletennisplayer &tp)

:tabletnnisplayer

(tp)

也可以寫成:

ratedplayer::

ratedplayer

(unsigned

int r,

const tabletennisplayer &tp)

:tabletnnisplayer

(tp), rating

(r)

派生類建構函式要點如下:

五、類成員函式繼承

**示例:

class

baset

void

func1()

virtual

void

func2()

};class

subtest

:public baset

void

func2()

};

int

main()

執行結果

baset: func

subtest: func1

subtest: func2

====

====

====

=baset: func

baset: func1

subtest: func2

五、使用虛函式的一些限制

(1):只有類成員函式才能宣告為虛函式,這是因為虛函式只適用於有繼承關係的類物件中。

(2):靜態成員函式不能說明為虛函式,因為靜態成員函式不受限與某個物件,整個記憶體中只有乙個,所以不會出現混淆的情況

(3):內聯函式不可以被繼承,因為內聯函式是不能子啊執行中動態的確認其位置的。

(4):建構函式不可以被繼承。

(5):析構函式可以被繼承,而且通常宣告為虛函式。

六、純虛函式

(1):解釋

虛函式是在基類中被宣告為virtual,並在派生類中重新定義的成員函式,可實現成員函式的動態過載

純虛函式的宣告有著特殊的語法格式:virtual 返回值型別成員函式名(參數列)=0;

(2):必要性:

在很多情況下,基類本身生成物件是不合情理的。例如,動物作為乙個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。為了解決上述問題,引入了純虛函式的概念,將函式定義為純虛函式(方法:virtual returntype function()= 0;),則編譯器要求在派生類中必須予以過載以實現多型性。同時含有純虛函式的類稱為抽象類,它不能生成物件。

(3):抽象類的解釋

包含純虛函式的類稱為抽象類。由於抽象類包含了沒有定義的純虛函式,所以不能定義抽象類的物件。

在c++中,抽象類只能用於被繼承而不能直接建立物件的類(abstract class)。

#include

#include

using

namespace std;

classa;

classb:

public a};

intmain()

C 的繼承與多型 詳解2

什麼叫多型 多型是指同樣的訊息被不同的物件接收時導致不同的行為。所謂的訊息是指對類成員函式的呼叫,不同的行為是指不同的實現,也就是呼叫了不同的函式。多型可以分為四類 過載多型,強制多型,包含多型,引數多型。前兩種稱為專用多型,後兩種稱為通用多型。函式過載,運算子過載屬於過載多型。強制型別轉換屬於強制...

C 繼承與多型

派生類繼承基類 又稱父類 超類 的屬性和方法,在此基礎上可以進行修改或新增新的屬性和方法。class 派生類名 繼承方式 基類名 為了保護基類的資料封裝性,無論哪種繼承方式,積累的私有成員在派生類中都是不可見的。1.public繼承 基類的訪問許可權在派生類中不變。公有還是公有,保護還是保護,派生類...

C 繼承與多型

1 分析菱形繼承的問題。2 剖析虛繼承是怎麼解決二義性和資料冗餘的 首先,我們先來看乙個菱形繼承的程式。為了解決以上問題,我們引入虛繼承的語法。可以有效的解決菱形繼承的資料冗餘和二義性問題。1.虛繼承解決了菱形繼承體系裡子類物件包含多份父類物件的資料冗餘問題和浪費空間的問題。2.虛繼承看起來複雜,但...