C++ 進階 教學 : 物件導向的深入觀念 -多型與虛擬函式
多型與虛擬函式
多型的應用是物件導向的深入觀念,要理解本章的內容。建議同學不只是要先看懂前面物件導向基本觀念與繼承的相關內容,而且要熟練。尤其要確實理解關於類別、物件與名稱的關係。
多型的實作,指的是父類別宣告的指標或參考,可以控制所有子類別物件的能力。也就是說:父類別宣告的指標或參考,可以代表任何子類別物件。
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. 可以做為實作多型的型別。