c 之多型篇(下) 虛表,多型呼叫

2021-07-30 09:24:10 字數 2233 閱讀 9776

定義:在成員函式的形參列表後面寫上=0,則成員函式為純虛函式。包含純虛函式的類叫做抽象類(也叫介面類),抽象類不能例項化出物件。純虛函式              在派生類中重新定義以後,派生類才能例項化出物件。 

測試**:

class base//抽象類

;class dervied:public base

測試**:

class base

int main()

分析如下:

對於有虛函式的類,編譯器都會維護一張虛表,物件的前四個位元組就是指向虛表的指標

測試**:

class ctest 

virtual void fun()

{} private:

int itest;

};int main()

virtual void funtest0()

virtual void funtest1()

virtual void funtest2()

private:

int m_itest;

};class derived:public base

virtual void funtest5()

virtual void funtest6()

};typedef void (*fun_test)();

void funtest()

virtual void funtest1()

virtual void funtest2()

virtual void funtest3()

};class cderived:public cbase

virtual void funtest1()

virtual void funtest4()

virtual void funtest5()

};typedef void (*_pfuntest)();

void funtest()

{

cbase base;

for (int iidx = 0; iidx < 4; ++iidx)

{

_pfuntest pfuntest = (_pfuntest)(*(( int*)*(int *)&base + iidx));

pfuntest();

cout<< ": "<

cbase類物件:

cderived類物件:

物件模型如下:

1. 動態多型的條件:

(1)基類中有虛函式,派生類中一定要重寫基類的虛函式

(2)必須使用基類的指標或引用呼叫派生類的虛函式。

2.基類虛表中的虛函式順序是按照虛函式在類中的宣告順序。

3

(1)先拷貝基類的虛函式

(2)派生類若重寫了哪個虛函式,就替換對應的基類虛函式

(3)最後跟上派生類自己的虛函式。

4.多型呼叫過程:(虛函式)

(1)取虛表指標(物件的前4位元組)

(2)取虛函式於虛表的偏移量

(3)呼叫虛函式

C 之多型篇

我的一點小想法 virtual只需要加在父類裡邊 析構函式和同名成員函式 就好,不過在子類的同名函式加上 virtual 是為了養成好的 書寫習慣。析構函式前邊加是為了防止沒有釋放子類物件的記憶體導致記憶體洩露,同名成員函式前加是為了父類例項化的物件指標能夠指向子類資料成員。這樣基本包含了所有的點了...

c 之多型篇(上)

物件型別 多型 是指向不同的物件傳送同乙個訊息,不同物件對應同一訊息產生不同行為。在程式中訊息就是呼叫函式,不同的行為就是指不同的實現方法,即執行不同的函式體。也可以這樣說就是實現了 乙個介面,多種方法 靜態多型 程式編譯時確定具體的工作 編譯器在編譯期間完成的,編譯器根據函式實參的型別 可能會進行...

C 之多型和虛函式

一.什麼是多型 多型與封裝,繼承一起構成了物件導向的3大特性。多型指向不同物件傳送同一訊息,不同的物件會產生不同的行為。也就是說每個物件用自己的方式去響應共同的訊息。c 有倆中形式的多型。如上課鈴打了,不同班級的同學走向不同的教室。編譯時的多型性,即靜態聯編 程式在編譯之前就可以確定的多型性,通過過...