C 類的多型

2021-10-04 08:17:30 字數 1726 閱讀 3680

多型按字面的意思就是多種形態。當類之間存在層次結構,並且類之間是通過繼承關聯時,就可能會用到多型。

c++多型就是當呼叫成員函式時,會根據呼叫函式的物件的型別來執行不同的函式。

我們以前說過的函式過載就是乙個簡單的靜態多型,靜態多型是編譯器在編譯期間完成的,編譯器會根據實參型別來選擇呼叫合適的函式,如果有合適的函式可以呼叫就調,沒有的話就會發出警告或者報錯。

示例(book236.cpp)

/*

* 程式名:book236.cpp,此程式用於演示c++類的靜態多型。

*/#include

#include

class

cgirl

// 定義超女類};

class

ckcon

:public cgirl // 定義王妃類,從超女類繼承};

intmain()

執行效果

在book236.cpp的main函式中,建立的是ckcon物件,如果採用基類指標呼叫show方法,變成了呼叫cgirl類的show方法,而不是ckcon類的show方法,因為pgirl是cgirl的指標,pgirl->show方法在程式編譯期間就已經設定好了。

動態多型是在程式執行時根據基類的引用(指標)指向的物件來確定自己具體該呼叫哪乙個類的虛函式。

讓我們對程式稍作修改,在cgirl類中,show方法的宣告前放置關鍵字 virtual,如下所示:

virtual

intshow()

// 顯示超女基本資訊的成員函式體

其它的**都不變,編譯並執行,結果如下:

此時,編譯器看的是指標的內容,而不是它的型別。這就是多型的一般使用方式。

虛函式是在基類中使用關鍵字 virtual 宣告的函式,在派生類中重新定義虛函式。

我們想要的是在程式中可以根據所呼叫的物件型別來選擇呼叫的函式,這種操作被稱為動態鏈結,或後期繫結。

我們可以在基類中只宣告虛函式,沒有函式的定義,在派生類中去實現函式的定義,這個時候就會用到純虛函式。

class

cgirl

// 定義超女類

;

virtual int show()=0;;告訴編譯器,函式只有宣告,沒有定義,是純虛函式。

介面描述了類的行為和功能,是標準和規範,而不需要完成類的功能實現。

c++介面是用抽象類來實現的,如果類中至少有乙個函式被宣告為純虛函式,則這個類就是抽象類。

設計抽象類的目的,是為了給其他類提供乙個可以繼承的基類。抽象類不能用於例項化物件,它只能作為介面使用。如果試圖例項化乙個抽象類的物件,會導致編譯錯誤。

如果乙個基類的派生類需要例項化,則必須實現每個虛函式的定義,如果沒有在派生類中純虛函式的定義會導致編譯錯誤。

可用於例項化物件的類被稱為具體類。

對初學者來說,類的多型、虛函式這些概念可能難以理解,因為您想不到它的應用場景,在實際開發中,這些知識的應用場景也比較少,在一些大型的專案開發中才可能用到,二十年來我只用過一次。

各位只要了解一下這些知識就可以了,掌握不了就算了。

C 類的多型

多型按字面的意思就是多種形態。當類之間存在層次結構,並且類之間是通過繼承關聯時,就可能會用到多型。c 多型就是當呼叫成員函式時,會根據呼叫函式的物件的型別來執行不同的函式。我們以前說過的函式過載就是乙個簡單的靜態多型,靜態多型是編譯器在編譯期間完成的,編譯器會根據實參型別來選擇呼叫合適的函式,如果有...

C 類的多型

多型按字面的意思就是多種形態。當類之間存在層次結構,並且類之間是通過繼承關聯時,就可能會用到多型。c 多型就是當呼叫成員函式時,會根據呼叫函式的物件的型別來執行不同的函式。我們以前說過的函式過載就是乙個簡單的靜態多型,靜態多型是編譯器在編譯期間完成的,編譯器會根據實參型別來選擇呼叫合適的函式,如果有...

C 的類反射多型機制

一 基類 class icmdstatic 二 子類1 class ccmd502 public icmdstatic 三 子類2 class ccmd503 public icmdstatic 四 類工廠模板標頭檔案 ifndef genericfactoryh define genericfac...