先上兩個簡單的父類子類。
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個介面,多種方法 在程式執行的過程中才決定呼叫的機制 程式實現上是這樣 通過父類指標呼叫子類的函式,可以讓父類指標有...