1. 程式人生 > 資訊 >谷歌 Wear OS 3 原生 UI 截圖曝光,採用類似 Android 12 的 Material You 設計

谷歌 Wear OS 3 原生 UI 截圖曝光,採用類似 Android 12 的 Material You 設計

我們直觀上認為,如果指標指向了派生類物件,那麼就應該使用派生類的成員變數和成員函式,這符合人們的思維習慣。但是本例的執行結果卻告訴我們,當基類指標 p 指向派生類 Teacher 的物件時,雖然使用了 Teacher 的成員變數,但是卻沒有使用它的成員函式,導致輸出結果不倫不類(趙巨集佳本來是一名老師,輸出結果卻顯示人家是個無業遊民),不符合我們的預期。

換句話說,通過基類指標只能訪問派生類的成員變數,但是不能訪問派生類的成員函式。

為了消除這種尷尬,讓基類指標能夠訪問派生類的成員函式,C++ 增加了虛擬函式(Virtual Function)。使用虛擬函式非常簡單,只需要在函式宣告前面增加 virtual 關鍵字。


和前面的例子相比,本例僅僅是在 display() 函式宣告前加了一個virtual
關鍵字,將成員函式宣告為了虛擬函式(Virtual Function),這樣就可以通過 p 指標呼叫 Teacher 類的成員函數了,執行結果也證明了這一點(趙巨集佳已經是一名老師了,不再是無業遊民了)。


有了虛擬函式,基類指標指向基類物件時就使用基類的成員(包括成員函式和成員變數),指向派生類物件時就使用派生類的成員。換句話說,基類指標可以按照基類的方式來做事,也可以按照派生類的方式來做事,它有多種形態,或者說有多種表現方式,我們將這種現象稱為多型(Polymorphism)

上面的程式碼中,同樣是p->display();這條語句,當 p 指向不同的物件時,它執行的操作是不一樣的。同一條語句可以執行不同的操作,看起來有不同表現方式,這就是多型。

多型是面向物件程式設計的主要特徵之一,C++中虛擬函式的唯一用處就是構成多型。

C++提供多型的目的是:可以通過基類指標對所有派生類(包括直接派生和間接派生)的成員變數和成員函式進行“全方位”的訪問,尤其是成員函式。如果沒有多型,我們只能訪問成員變數。

前面我們說過,通過指標呼叫普通的成員函式時會根據指標的型別(通過哪個類定義的指標)來判斷呼叫哪個類的成員函式,但是通過本節的分析可以發現,這種說法並不適用於虛擬函式,虛擬函式是根據指標的指向來呼叫的,指標指向哪個類的物件就呼叫哪個類的虛擬函式。






 C++多型和虛擬函式快速入門教程 (biancheng.net)