C 多型坑點的實現機制

2021-10-09 04:41:32 字數 1395 閱讀 2026

先上兩個簡單的父類子類。

class

base

virtual

void

func1

(int value =1)

};class

derive

:public base

virtual

void

func1

(int value =2)

};

main函式下:

derive derive;

derive *pdervie =

&derive;

pdervie-

>

func()

;//呼叫的子類函式

base *pbase =

&derive;

pbase-

>

func()

;//呼叫的父類函式

普通函式是靜態繫結,呼叫哪個的類的成員函式取決於靜態型別。

就是定義時候的型別,不管他指向了哪個型別,在編譯期

結論,不應該在子類中重新定義乙個繼承來的成員函式。

//虛函式的動態繫結

base base;

pdervie-

>

func1()

;//子類呼叫虛函式

pbase-

>

func1()

;//父類呼叫

pbase =

&base;

//現在重新指向回父類指標型別

pbase-

>

func1()

;//於是重新呼叫了父類的虛函式

//derive 虛函式 value =1

結論虛函式是動態繫結,呼叫哪個類的虛函式,取決於指向了何種型別

但是,虛函式的預設引數是靜態繫結的,所以value的值還是1,因為編譯器實現預設引數的動態繫結效率比較低,所以做了乙個取捨

c++中的多型體現

有乙個觀點是肯定的:多型,必須是存在虛函式,並且呼叫虛函式

當我們呼叫了乙個虛函式的時候,走的是不是通過虛函式表來找到虛函式表,然後執行虛函式,如果是這樣,必然是多型,否則就不是

特別說明,如果類有多個基類,則有多個虛函式表指標,並不是多個虛函式表,且子類於第乙個基類共用,vptr

如果父類有虛函式,就等於子類也有,就等於也有虛函式表指標,同屬乙個類,共用共享的虛函式表

比如:base base=derive;

直接用子類物件給父類物件賦值

初始化父類時,把子類屬於父類的一部分切割出來,給了子類,但是子類的虛函式表指標值不去覆蓋父類的,這是編譯器的優化選擇。

C 多型實現的機制

1 多型的概念 從使用方式上簡單的說 就是將父型別的指標指向其子類的例項,然後通過父類指標呼叫子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的 來實現可變的演算法。比如 模板技術,rtti技術,虛函式技術,要麼是試圖做到在編譯時決議,要麼...

C 多型實現機制剖析

物件導向的三大概念 封裝,繼承,多型。封裝突破了c語言函式的概念 繼承實現了 的復用,那麼多型實現了什麼價值呢,簡單理解就是前人寫的 框架 可以呼叫後人寫的 1 什麼是多型?多型性可以簡單的概括為 1個介面,多種方法 在程式執行的過程中才決定呼叫的機制 程式實現上是這樣 通過父類指標呼叫子類的函式,...

C 多型實現機制剖析

物件導向的三大概念 封裝,繼承,多型。封裝突破了c語言函式的概念 繼承實現了 的復用,那麼多型實現了什麼價值呢,簡單理解就是前人寫的 框架 可以呼叫後人寫的 多型性可以簡單的概括為 1個介面,多種方法 在程式執行的過程中才決定呼叫的機制 程式實現上是這樣 通過父類指標呼叫子類的函式,可以讓父類指標有...