C++ 進階 教學 : 物件導向的深入觀念 -多型與虛擬函式



好的頻道需要你的支持,謝謝你使用Youtube影片的超級感謝功能給我們鼓勵。












好的頻道需要你的支持,謝謝你使用Youtube影片的超級感謝功能給我們鼓勵。

多型與虛擬函式

  

多型的應用是物件導向的深入觀念,要理解本章的內容。建議同學不只是要先看懂前面物件導向基本觀念與繼承的相關內容,而且要熟練。尤其要確實理解關於類別、物件與名稱的關係。

 

  多型的實作,指的是父類別宣告的指標或參考,可以控制所有子類別物件的能力。也就是說:父類別宣告的指標或參考,可以代表任何子類別物件。  

 

Q. 多型的目的?

A. 以父類別宣告的指標或參考呼叫成員函式,會因為指派的物件不同而有不同的執行結果。可以避免不必要的Overload。

 

Q. 什麼是 is-a ?

A. 用來描述類別與類別的關係。子類別 is-a 父類別。繼承了就是了。

例:無線光學滑鼠 is-a 光學滑鼠 is-a 滑鼠 is-a 電腦周邊 is-a 電子設備。

而因為子類別 is-a 父類別,所以一個型別為子類別型別的物件,也是型別為父類別型別的物件。

 

Q. 物件多型?
A.
只要是物件就一定有型別。而且會有多種型別。而這多種型別之間,必定有父子型別的關係。

例 1:

有父子關係的型別:電子設備 -> 電話 -> 行動電話 -> 智慧型手機。

物件:你身上的手機。

  你身上的手機是一個物件,是一個型別為智慧型手機的物件,也是一個型別為行動電話的物件,也是一個型別為電話的物件,也是一個型別為電子設備的物件。

 

例 2:

有父子關係的型別:電子設備 -> 電腦週邊 -> 滑鼠 -> 光學滑鼠 -> 無線光學滑鼠。

物件:你桌上的滑鼠。

  你桌上的無線光學滑鼠是一個物件,是一個型別為無線光學滑鼠的物件,也是一個型別為光學滑鼠的物件,也是一個型別為滑鼠的物件,也是一個型別為電子設備的物件。

 

Q. 什麼是 has-a?

A. 用來描述類別與類別的關係。在A類別中有用B類別宣告成員變數,我們便可以說A has-a B。

例:電腦 has-a CPU。

一個型別為電腦的物件中會包含CPU物件。

 

一、        多型

1.        指派

將子類別宣告的物件變數指派到父類別宣告的物件變數。其實是物件的複製,並不是多型的應用。

A.        指標

將子類別物件指派到以父類別宣告的指標。

B.         參考

將子類別物件指派到以父類別宣告的參考。

C.         集合

將子類別物件指派到以父類別宣告的集合。

D.        參數

將子類別物件指派到以父類別宣告的參數。

2.        函式呼叫

無論是物件變數、參考或指標,都只能呼叫父類別中的成員。

3.        函式執行

就算子類別中有定義相同的成員函式。無論是物件變數、參考或指標,都執行父類別中的定義的內容。

二、        虛擬函式

1.        父類別

A.        宣告與定義虛擬函式

在函式宣告敍述前加上關鍵字 virtual。

B.         宣告虛擬解構函式

virtual ~ClassName(){}

2.        子類別

A.        Override 父類別宣告的虛擬函式。

再次宣告與定義父類別中宣告的虛擬函式。

B.         以多型指標呼叫虛擬函式。

執行子類別 Override 的內容。

C.         以多型參考呼叫虛擬函式。

執行子類別 Override 的內容。

3.        dynamic cast

A.        指標

dynamic_cast<type*>(pointer)

失敗時其值為0。

B.         參考

dynamic_cast<type&>(reference)

失敗時產生Exception。

三、        純虛擬函式

1.        宣告純虛擬函式

virtual type name (parameter list) = 0;

2.        抽象類別

類別中若宣告或繼承了一個或多個純虛擬函式,此類別即為抽象類別。

A.      不可建立物件。  

B.      可以做為實作多型的型別。





作者 : 許裕永