C++編譯期多態(tài)與運行期多態(tài)是什么樣的,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的中江網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!今日的C++不再是個單純的“帶類的C”語言,它已經(jīng)發(fā)展成為一個多種次語言所組成的語言集合,其中泛型編程與基于它的STL是C++發(fā)展中最為出彩的那部分。在面向?qū)ο驝++編程中,多態(tài)是OO三大特性之一,這種多態(tài)稱為運行期多態(tài),也稱為動態(tài)多態(tài);在泛型編程中,多態(tài)基于template(模板)的具現(xiàn)化與函數(shù)的重載解析,這種多態(tài)在編譯期進行,因此稱為編譯期多態(tài)或靜態(tài)多態(tài)。
運行期多態(tài)
運行期多態(tài)的設(shè)計思想要歸結(jié)到類繼承體系的設(shè)計上去。對于有相關(guān)功能的對象集合,我們總希望能夠抽象出它們共有的功能集合,在基類中將這些功能聲明為虛接口(虛函數(shù)),然后由子類繼承基類去重寫這些虛接口,以實現(xiàn)子類特有的具體功能。典
class Animal
{
public :
virtual void shout() = 0;
};
class Dog :public Animal
{
public:
virtual void shout(){ cout << "汪汪!"< }; class Cat :public Animal { public: virtual void shout(){ cout << "喵喵~"< }; class Bird : public Animal { public: virtual void shout(){ cout << "嘰喳!"< }; int main() { Animal * anim1 = new Dog; Animal * anim2 = new Cat; Animal * anim3 = new Bird; //藉由指針(或引用)調(diào)用的接口,在運行期確定指針(或引用)所指對象的真正類型,調(diào)用該類型對應(yīng)的接口 anim1->shout();
anim2->shout();
anim3->shout();
//delete 對象
...
return 0;
}
運行期多態(tài)的實現(xiàn)依賴于虛函數(shù)機制。當(dāng)某個類聲明了虛函數(shù)時,編譯器將為該類對象安插一個虛函數(shù)表指針,并為該類設(shè)置一張的虛函數(shù)表,虛函數(shù)表中存放的是該類虛函數(shù)地址。運行期間通過虛函數(shù)表指針與虛函數(shù)表去確定該類虛函數(shù)的真正實現(xiàn)。
運行期多態(tài)的優(yōu)勢還在于它使處理異質(zhì)對象集合稱為可能:
//我們有個動物園,里面有一堆動物
int main()
{
vectoranims;
Animal * anim1 = new Dog;
Animal * anim2 = new Cat;
Animal * anim3 = new Bird;
Animal * anim4 = new Dog;
Animal * anim5 = new Cat;
Animal * anim6 = new Bird;
//處理異質(zhì)類集合
anims.push_back(anim1);
anims.push_back(anim2);
anims.push_back(anim3);
anims.push_back(anim4);
anims.push_back(anim5);
anims.push_back(anim6);
for (auto & i : anims)
{
i->shout();
}
//delete對象
//...
return 0;
}
總結(jié):運行期多態(tài)通過虛函數(shù)發(fā)生于運行期
編譯期多態(tài)
對模板參數(shù)而言,多態(tài)是通過模板具現(xiàn)化和函數(shù)重載解析實現(xiàn)的。以不同的模板參數(shù)具現(xiàn)化導(dǎo)致調(diào)用不同的函數(shù),這就是所謂的編譯期多態(tài)。相比較于運行期多態(tài),實現(xiàn)編譯期多態(tài)的類之間并不需要成為一個繼承體系,它們之間可以沒有什么關(guān)系,但約束是它們都有相同的隱式接口。我們將上面的例子改寫為:
class Animal
{
public :
void shout() { cout << "發(fā)出動物的叫聲" << endl; }; }; class Dog { public: 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(); } 在編譯之前,函數(shù)模板中t.shout()調(diào)用的是哪個接口并不確定。在編譯期間,編譯器推斷出模板參數(shù),因此確定調(diào)用的shout是哪個具體類型的接口。不同的推斷結(jié)果調(diào)用不同的函數(shù),這就是編譯器多態(tài)。這類似于重載函數(shù)在編譯器進行推導(dǎo),以確定哪一個函數(shù)被調(diào)用。 運行期多態(tài)與編譯期多態(tài)優(yōu)缺點分析 運行期多態(tài)優(yōu)點
OO設(shè)計中重要的特性,對客觀世界直覺認識。
能夠處理同一個繼承體系下的異質(zhì)類集合。
運行期多態(tài)缺點
運行期間進行虛函數(shù)綁定,提高了程序運行開銷。
龐大的類繼承層次,對接口的修改易影響類繼承層次。
由于虛函數(shù)在運行期在確定,所以編譯器無法對虛函數(shù)進行優(yōu)化。
虛表指針增大了對象體積,類也多了一張?zhí)摵瘮?shù)表,當(dāng)然,這是理所應(yīng)當(dāng)值得付出的資源消耗,列為缺點有點勉強。
編譯期多態(tài)優(yōu)點
它帶來了泛型編程的概念,使得C++擁有泛型編程與STL這樣的強大武器。
在編譯器完成多態(tài),提高運行期效率。
具有很強的適配性與松耦合性,對于特殊類型可由模板偏特化、全特化來處理。
編譯期多態(tài)缺點
程序可讀性降低,代碼調(diào)試帶來困難。
無法實現(xiàn)模板的分離編譯,當(dāng)工程很大時,編譯時間不可小覷。
無法處理異質(zhì)對象集合。
關(guān)于顯式接口與隱式接口
所謂的顯式接口是指類繼承層次中定義的接口或是某個具體類提供的接口,總而言之,我們能夠在源代碼中找到這個接口.顯式接口以函數(shù)簽名為中心,例如
void AnimalShot(Animal & anim)
{
anim.shout();
}
我們稱shout為一個顯式接口。在運行期多態(tài)中的接口皆為顯式接口。
而對模板參數(shù)而言,接口是隱式的,奠基于有效表達式。例如:
template
void AnimalShot(T & anim)
{
anim.shout();
}
對于anim來說,必須支持哪一種接口,要由模板參數(shù)執(zhí)行于anim身上的操作來決定,在上面這個例子中,T必須支持shout()操作,那么shout就是T的一個隱式接口。
關(guān)于C++編譯期多態(tài)與運行期多態(tài)是什么樣的問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。
本文題目:C++編譯期多態(tài)與運行期多態(tài)是什么樣的-創(chuàng)新互聯(lián)
文章分享:http://bm7419.com/article40/ddjeho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、微信小程序、網(wǎng)頁設(shè)計公司、搜索引擎優(yōu)化、面包屑導(dǎo)航、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容