今日的c++不再是個單純的「帶類的c」語言,它已經發展成為乙個多種次語言所組成的語言集合,其中泛型程式設計與基於它的stl是c++發展中最為出彩的那部分。在物件導向c++程式設計中,多型是oo三大特性之一,這種多型稱為執行期多型,也稱為動態多型;在泛型程式設計中,多型基於template(模板)的具現化與函式的過載解析,這種多型在編譯期進行,因此稱為編譯期多型或靜態多型。在本文中,我們將了解:
什麼是執行期多型
什麼是編譯期多型
它們的優缺點在哪
執行期多型的設計思想要歸結到類繼承體系的設計上去。對於有相關功能的物件集合,我們總希望能夠抽象出它們共有的功能集合,在基類中將這些功能宣告為虛介面(虛函式),然後由子類繼承基類去重寫這些虛介面,以實現子類特有的具體功能。典型地我們會舉下面這個例子:
void shout(){ cout << "汪汪!"<
class cat
public:
void shout(){ cout << "喵喵~"<
class bird
public:
void shout(){ cout << "嘰喳!"<
template
void animalshout(t & t)
t.shout();
int main()
animal anim;
dog dog;
cat cat;
bird bird;
animalshout(anim);
animalshout(dog);
animalshout(cat);
animalshout(bird);
getchar();
在編譯之前,函式模板中t.shout()呼叫的是哪個介面並不確定。在編譯期間,編譯器推斷出模板引數,因此確定呼叫的shout是哪個具體型別的介面。不同的推斷結果呼叫不同的函式,這就是編譯器多型。這類似於過載函式在編譯器進行推導,以確定哪乙個函式被呼叫。
執行期多型優點
oo設計中重要的特性,對客觀世界直覺認識。
能夠處理同乙個繼承體系下的異質類集合。
執行期多型缺點
執行期間進行虛函式繫結,提高了程式執行開銷。
龐大的類繼承層次,對介面的修改易影響類繼承層次。
由於虛函式在執行期在確定,所以編譯器無法對虛函式進行優化。
虛表指標增大了物件體積,類也多了一張虛函式表,當然,這是理所應當值得付出的資源消耗,列為缺點有點勉強。編譯期多型優點它帶來了泛型程式設計的概念,使得c++擁有泛型程式設計與stl這樣的強大**。
在編譯器完成多型,提高執行期效率。
具有很強的適配性與松耦合性,對於特殊型別可由模板偏特化、全特化來處理。
編譯期多型缺點
程式可讀性降低,**除錯帶來困難。
無法實現模板的分離編譯,當工程很大時,編譯時間不可小覷。
無法處理異質物件集合。
回到頂部
所謂的顯式介面是指類繼承層次中定義的介面或是某個具體類提供的介面,總而言之,我們能夠在源**中找到這個介面.顯式介面以函式簽名為中心,例如
void animalshot(animal & anim)
anim.shout();
我們稱shout為乙個顯式介面。在執行期多型中的介面皆為顯式介面。
而對模板引數而言,介面是隱式的,奠基於有效表示式。例如:
template
void animalshot(t & anim)
anim.shout();
對於anim來說,必須支援哪一種介面,要由模板引數執行於anim身上的操作來決定,在上面這個例子中,t必須支援shout()操作,那麼shout就是t的乙個隱式介面。
C 編譯期多型與執行期多型
閱讀目錄 關於顯式介面與隱式介面 正文 回到頂部 今日的c 不再是個單純的 帶類的c 語言,它已經發展成為乙個多種次語言所組成的語言集合,其中泛型程式設計與基於它的stl是c 發展中最為出彩的那部分。在物件導向c 程式設計中,多型是oo三大特性之一,這種多型稱為執行期多型,也稱為動態多型 在泛型程式...
C 編譯期多型與執行期多型
今日的c 不再是個單純的 帶類的c 語言,它已經發展成為乙個多種次語言所組成的語言集合,其中泛型程式設計與基於它的stl是c 發展中最為出彩的那部分。在物件導向c 程式設計中,多型是oo三大特性之一,這種多型稱為執行期多型,也稱為動態多型 在泛型程式設計中,多型基於template 模板 的具現化與...
C 編譯期多型與執行期多型
閱讀目錄 關於顯式介面與隱式介面 正文 回到頂部 今日的c 不再是個單純的 帶類的c 語言,它已經發展成為乙個多種次語言所組成的語言集合,其中泛型程式設計與基於它的stl是c 發展中最為出彩的那部分。在物件導向c 程式設計中,多型是oo三大特性之一,這種多型稱為執行期多型,也稱為動態多型 在泛型程式...