C 怎麼實現多型?

2022-07-07 13:36:12 字數 2179 閱讀 6698

c++通過函式過載或模板實現編譯期多型(靜態繫結),通過虛函式實現執行時多型(動態繫結)。

#include int add(int a, int b)

int add(double a, double b)

void testadd()

以上**用g++編譯可以通過,如果用gcc編譯則會報錯(說明c語言不支援函式過載):

看下編譯後的函式名:

可以看到,編譯器在add函式名後加上了引數型別ii(int,int) dd(double,double)。

template t sub(t a, t b)

void testsub()

這種方式只需要寫一套**,編譯器會根據使用者呼叫 生成不同的函式定義,這裡生成了兩個函式(int和double)

template class foo

};void testmul()

類模板和函式模板類似,可以先把變數型別用模板佔位,編譯時通過使用者指定的型別來生成具體定義。

class base

int m_b;

};class derive : public base

virtual void show()

int m_d;

};class derive2 : public base

};void testvirtual()

c++通過virtual關鍵字實現虛函式,執行結果如下:

可以看到,父類指標指向不同的派生類,就能夠呼叫不同派生類的實現,這就是所謂的執行時多型。

c/c++程式的記憶體格局通常分為四個區:全域性資料區,**區,棧區,堆區。

c++由於類和虛函式的存在,會複雜一點:

void testmemory()

64位機器上輸出結果:

可以看到虛表指標位於最開始的位置,大小是8byte。基類的成員變數m_b位於中間位置,大小是4byte。子類的成員變數m_d位於最後。

現在有乙個類,用到多繼承(實際編碼中不推薦多繼承)

class base2

};class multiderive : public base, public base2

int m_d;

};void testmulmemory()

執行結果如下:

基類base的虛表指標和成員變數(int 4byte記憶體對齊成了8byte)位於最開始,基類base2的虛表指標位於中間,最後是派生類multiderive的成員變數。

圖示如下:

模板類可以包含虛函式,普通成員函式可以使用模板,**如下:

template class math1

virtual int sub(int a, int b)

p m_a;

};

virtual成員函式不能使用模板,以下**會報錯:

原因是:編譯器需要在編譯時確定虛函式表的大小,並為每乙個虛函式指標分配儲存空間。由於不確定模板虛函式會例項化多少個,也就沒辦法分配空間,所以禁止這麼做。

C 實現多型

多型 就是指不同物件收到相同訊息是,會產生不同行為,同乙個類在不同的場合下表現出不同的行為特徵 多型的作用 把不同的子類物件都當做父類來看,可以遮蔽不同子類物件之間的差異,寫出通用的 做出通用的程式設計,以適應需求的不斷變化。實現多型有三種形式 虛方法抽象類介面 下面,使用虛方法,簡單實現多型效果 ...

C 多型實現

多型 多型的含義為 乙個事物的多種形態,在c 程式設計張,多型性是指具有不同功能的函式可以用同乙個函式名,這樣就可以用乙個函式名呼叫不同內容的函式。一般多型分為兩種 1 靜態多型 也成為編譯多型,主要包括引數多型,過載多型和強制多型。引數多型 採用引數化模板,通過給出不同的型別引數,使的乙個結構有多...

C 多型實現原理

用virtual關鍵字申明的函式叫做虛函式,虛函式肯定是類的成員函式。存在虛函式的類都有乙個一維的虛函式表叫做虛表。類的物件有乙個指向虛表開始的虛指標。虛表是和類對應的,虛表指標是和物件對應的。多型性是乙個介面多種實現,是物件導向的核心。分為類的多型性和函式的多型性。多型用虛函式來實現,結合動態繫結...