關於多型性和虛函式的理解

2021-06-08 13:47:05 字數 781 閱讀 8715

對於多型性的理解加深,編譯器的型別轉換,以及

我們在講fish類的物件fh的位址賦給pan之時,c++編譯器進行了型別轉換,此時pan儲存的是animal物件的位址。當fn函式執行pan->breath()時,呼叫的就是animal的物件的breath函式。

<-this指標

anima物件記憶體

fish新增加的部分

當構造fish類的物件時,先從animal 的建構函式去構造animal物件,然後呼叫fish類的建構函式完成自身部分的構造,從而拼接出乙個完整的fish物件,當講fish類的物件轉換成animal 的型別時,該物件被認為是源物件整個記憶體模型的上半部分,即為animal的物件所佔的記憶體。

virtual關鍵字可以改變此種情況;

當c++編譯器在編譯的時候,發現animal的類的breath()函式是虛函式,這個時候c++採用遲邦定技術,編譯時並不確定其具體的呼叫函式,而在執行時,依據物件的型別(比如是傳遞的類物件的位址)來確認呼叫的是哪乙個函式。這種能力就是c++的多型性。,如果沒有在breath()函式前加virtual關鍵字時,c++編譯器在編譯時就確定了哪個函式被呼叫,這叫做早期繫結。

c++的多型性用一句話概括:在基類的函式前加上virtual關鍵字,在派生類中重寫該函式,執行時將會根據物件的實際型別來呼叫相應的函式。如果物件的型別是派生類,就呼叫派生類的函式,如果物件型別是基類,就呼叫基類的函式。

凡是含有純虛函式的類叫做抽象類,這種類只是作為基類的派生類服務,在派生類中必須完全實現基類的純虛函式,否則,派生類也變成了抽象類,不能例項化物件。

多型性和虛函式

11.27 多型指的是同樣的資訊被不同型別的物件接收導致不同的行為,包括 靜態多型性和動態多型性。靜態多型性包括 函式過載和運算子過載 動態多型主要 由虛函式實現。虛函式宣告 virsual 型別說明符 函式名 參數列 純虛函式 virtual 函式型別 函式名 參數列 0 在派生類中定義 抽象類 ...

多型性和虛函式

多型性是物件導向程式設計的乙個重要特徵。c 支援多型性,在 c 程式設計中能夠實現多型性。1 乙個典型的例子 先建立乙個 point 點 類,包含資料成員x,y 座標點 以他為基類,派生出乙個 circle 圓 類,增減資料成員 r 半徑 再以 circle 類為直接基類,派生出乙個 cylinde...

多型性和虛函式

1 向上型別轉換 取乙個物件的位址並將其作為基類的物件來使用 2 函式體和函式呼叫相聯絡稱為 遭 在程式執行之前 晚 在程式執行時 3 虛函式 為了引起晚 需要在基類使用vitual修飾函式 4 c 如何實現晚 vtable 編譯器放置特定的虛函式位址 在每個虛函式類中,編譯器秘密的放置乙個指標。指...