virtual實現原理

2021-06-19 11:17:23 字數 543 閱讀 7857

1. 在沒有virtual的情況下,以基類指標呼叫時編譯器並不知道比基類更多的東西,通常呼叫函式的基類版本

2. 當用virtual宣告函式時,每當建立乙個包含虛函式的類或者從包含虛函式的類派生的類時,編譯器就建立乙個vtable

3. 如果派生類沒有對基類的virtual函式進行重新定義,vtable中就填充基類的虛函式的位址

4. 編譯器會在類中放置乙個vptr,vptr指向相應的vtable,vptr的初始化在建構函式中完成

1.  vptr常常在物件的開頭

2. 所有的vtable有相同的順序,不管何種型別的物件play()是第乙個,what()是第二個,adjust()是第三個,所以編譯器知道adjust在vptr+2處,而不是以instrument::adjust位址呼叫這個函式(這是早繫結)

abstract和virtual方法實現多型的區別

多型就是不同物件對同乙個訊息的不同相應方式。舉例 cut 訊息 醫生收到cut訊息後,執行動手術 理髮師收到cut訊息後,執行減法 演員收到cut訊息後,停止演出。三個不同物件,對同乙個cut訊息的反應都不同,這就是多型。在c 中abstract和virtual方法都能實現多型。1.用abstrac...

abstract和virtual方法實現多型的區別

多型就是不同物件對同乙個訊息的不同相應方式。舉例 cut 訊息 醫生收到cut訊息後,執行動手術 理髮師收到cut訊息後,執行減法 演員收到cut訊息後,停止演出。三個不同物件,對同乙個cut訊息的反應都不同,這就是多型。在c 中abstract和virtual方法都能實現多型。1.用abstrac...

C 不使用virtual實現多型

不使用virtual實現多型可以用成員函式指標完成。成員函式指標形式 返回型別 a 指標名 形參表 其中a是類型別,即這個指標是指向a類的成員函式的函式指標 例如 int a p int,int 這是乙個指向 a類的帶有兩個int型形參且返回值是int的成員函式 的指標,指標名是p。下面是 incl...