覆載(Override)、隱藏(Hiding)、與多載(Overloading)

覆載(Override)

配合繼承架構, 衍生類別的虛擬函式可以取代基礎類別的同名虛擬函式, 運用多型指標時虛擬函式呼叫可以動態地繫結 (bind) 到該物件的虛擬函式上, 例如:

多載(Overloading)

在同一個命名區間 (name space) 中兩個函式有同樣的名稱但是具有不同的參數個數或是參數型態的稱為多載函式, 例如: 上例中兩個函式可以是虛擬函式或是一般的函式,

注意:

隱藏(Hiding)

在繼承架構中, 衍生類別的界面除了自己定義的界面之外、 還包括所有基礎類別裡所定義的界面, 但是當衍生類別中定義一個和基礎類別中同名的函式時, 基礎類別中那個同名的函式 (不管它的參數是不是一樣) 就會被隱藏起來, 透過衍生類別的指標或是物件參考都沒有辦法直接呼叫到, 例如: 注意:

多型

上述兩者的目的都是希望讓程式設計者可以用高階、抽象的方法來使用不同的程式碼, 例如: x + y, 讓編譯器自己根據 x 與 y 的型態來決定該如何完成 x + y 的動作, 或是例如: bPtr->service(), 讓虛擬函式表格中的函式指標在程式執行時自動選擇正確的函式來呼叫, 如此程式設計的彈性加大, 擴充的能力加強, 有較好的程式碼重用 (reuse) 架構。

注意:

C++ 中允許靜態繫結的好處

C++ 的類別中可以有虛擬的成員函式以及一般的成員函式, 虛擬的成員函式如果配合基礎類別的多型指標/參考來使用的話, 可以展現動態多型的特性, 使得程式維持較多的彈性, 但是許多類別並不需要繼承的架構, 甚至虛擬的成員函式如果配合 inline、 或是一般的物件參考來使用的話, 編譯器可以靜態繫結來完成, 如此效率會比較高, 至於一般的成員函式則一律藉由靜態繫結來呼叫。

注意:在 Java 語言中所有的成員函式都是以動態繫結的方式來呼叫的。

請不要多載 (overload) 虛擬函式

在繼承架構中如果多載一個虛擬函式的話, 會導致所有的衍生類別中都需要 override 所有的虛擬函式, 例如:

C++ 程式設計課程 首頁

製作日期: 05/15/2001 by 丁培毅 (Pei-yih Ting)
E-mail: pyting@cs.ntou.edu.tw TEL: 02 24622192x6615
海洋大學 理工學院 資訊科學系