c++多型分為動態多型和靜態多型,靜態多型就是函式承過載,運算子過載。動態多型就是派生類和虛函式之間的關係了。
靜態多型地制早繫結。
動態多型就是位址晚繫結,發生在程式執行階段。
首先動態多型發生的條件:有繼承關係、子類中重寫了父類中的虛函式
過載與重寫:過載要求函式名相同,而函式的引數不同。 重寫要求函式的名、返回值型別、引數值都要完全相同。
//動態多型
class
animal};
class
cat:
public animal};
class
dog:
public animal};
void
dospeak
(animal &animal)
void
test1()
void
test2()
intmain()
當animal類中成員函式前加上virtual關鍵字時利用sizeof關鍵字可以檢視的大小為4,當沒有virtual關鍵字時大小為1
利用vs開放人員工具可以檢視內部結構![
vfptr:虛函式指標,他指向虛函式表 vftable
當子類中沒有發生重寫的時候
cat的內部結構!
[在](https:
20200218165449966.png?x-oss-process=image/watermark,type_zmfuz3pozw5na**pdgk,shadow_10,text_ahr0chm6ly9ibg9nlmnzzg4ubmv0l3fxxzi5mtmxota3,size_16,color_ffffff,t_70)
可以看到貓類的虛函式表裡記錄的函式位址是cat中重寫的speak函式位址,所以當利用父類指標或引用呼叫speak()
函式時就會走貓類重寫的函式
//檢視內部結構命令
1.vs開發人員命令提示符
2.開啟專案所在資料夾 cd 開啟
3.cl /d1 reportsingleclasslayout+想要檢視的類名 +檔名cpp檔案
通常在多型中,父類中的虛函式實現是沒有意義的,主要是呼叫子類虛函式重寫的內容,因此可以將此虛函式寫為純虛函式
語法:virtual 返回值型別 型別名 (引數列表)=
0當類中有了純虛函式之後。這個類也就成了抽象類
虛析構和純虛析構
多型在使用時,如果子類中有屬性開闢到堆區,那麼父類指標在釋放時無法呼叫到子類的析構**
解決方式:將父類中的析構函式改為虛析構或者純虛析構
虛析構和純虛析構的共性:
可以解決父類指標釋放子類物件
都需要具體函式實現
虛析構和純虛析構的區別:
如果是純虛析構,該類屬於抽象類,無法例項化物件
C 多型 靜態多型與動態多型
多型 顧名思義,多型就是多種形態,也就是對不同物件傳送同乙個訊息,不同物件會做出不同的響應。並且多型分為靜態多型和動態多型。靜態多型就是在系統編譯期間就可以確定程式執行到這裡將要執行哪個函式,例如 函式的過載,物件名加點操作符執行成員函式等,都是靜態多型,其中,過載是在形成符號表的時候,對函式名做了...
C 靜態多型與動態多型
多型按字面的意思就是多種形態,相同的方法呼叫,但是有不同的實現方式。多型性可以簡單地概括為 乙個介面,多種方法 c 有兩種多型形式 靜態多型 也稱為編譯期間的多型,編譯器在編譯期間完成的,編譯器根據函式實參的型別 可能會進行隱式型別轉換 可推斷出要呼叫那個函式,如果有對應的函式就呼叫該函式,否則出現...
C 動態多型與靜態多型
c 中有兩種多型 動多型 執行期多型 和靜多型 編譯期多型 而靜多型主要通過模板來實現,巨集也是實現靜多型的一種途徑。模板不採用虛函式機制,所以所有呼叫在編譯期就可確定,因此它是靜態的。基於繼承和虛函式,多型的設計思想主要在於 對於幾個相關物件的型別,確定它們之間的乙個共同功能集 然後在基類中,把這...