真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++編譯期多態(tài)與運(yùn)行期多態(tài)是什么樣的-創(chuàng)新互聯(lián)

C++編譯期多態(tài)與運(yùn)行期多態(tài)是什么樣的,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的中江網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

今日的C++不再是個(gè)單純的“帶類的C”語(yǔ)言,它已經(jīng)發(fā)展成為一個(gè)多種次語(yǔ)言所組成的語(yǔ)言集合,其中泛型編程與基于它的STL是C++發(fā)展中最為出彩的那部分。在面向?qū)ο驝++編程中,多態(tài)是OO三大特性之一,這種多態(tài)稱為運(yùn)行期多態(tài),也稱為動(dòng)態(tài)多態(tài);在泛型編程中,多態(tài)基于template(模板)的具現(xiàn)化與函數(shù)的重載解析,這種多態(tài)在編譯期進(jìn)行,因此稱為編譯期多態(tài)或靜態(tài)多態(tài)。

運(yùn)行期多態(tài)

運(yùn)行期多態(tài)的設(shè)計(jì)思想要?dú)w結(jié)到類繼承體系的設(shè)計(jì)上去。對(duì)于有相關(guān)功能的對(duì)象集合,我們總希望能夠抽象出它們共有的功能集合,在基類中將這些功能聲明為虛接口(虛函數(shù)),然后由子類繼承基類去重寫(xiě)這些虛接口,以實(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)用的接口,在運(yùn)行期確定指針(或引用)所指對(duì)象的真正類型,調(diào)用該類型對(duì)應(yīng)的接口   anim1->shout();

anim2->shout();

anim3->shout();

//delete 對(duì)象

...

return 0;

}

運(yùn)行期多態(tài)的實(shí)現(xiàn)依賴于虛函數(shù)機(jī)制。當(dāng)某個(gè)類聲明了虛函數(shù)時(shí),編譯器將為該類對(duì)象安插一個(gè)虛函數(shù)表指針,并為該類設(shè)置一張的虛函數(shù)表,虛函數(shù)表中存放的是該類虛函數(shù)地址。運(yùn)行期間通過(guò)虛函數(shù)表指針與虛函數(shù)表去確定該類虛函數(shù)的真正實(shí)現(xiàn)。

運(yùn)行期多態(tài)的優(yōu)勢(shì)還在于它使處理異質(zhì)對(duì)象集合稱為可能:

//我們有個(gè)動(dòng)物園,里面有一堆動(dòng)物

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對(duì)象

//...

return 0;

}

總結(jié):運(yùn)行期多態(tài)通過(guò)虛函數(shù)發(fā)生于運(yùn)行期

編譯期多態(tài)

對(duì)模板參數(shù)而言,多態(tài)是通過(guò)模板具現(xiàn)化和函數(shù)重載解析實(shí)現(xiàn)的。以不同的模板參數(shù)具現(xiàn)化導(dǎo)致調(diào)用不同的函數(shù),這就是所謂的編譯期多態(tài)。相比較于運(yùn)行期多態(tài),實(shí)現(xiàn)編譯期多態(tài)的類之間并不需要成為一個(gè)繼承體系,它們之間可以沒(méi)有什么關(guān)系,但約束是它們都有相同的隱式接口。我們將上面的例子改寫(xiě)為:

class Animal

{

public :

void shout() { cout << "發(fā)出動(dòng)物的叫聲" << 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)用的是哪個(gè)接口并不確定。在編譯期間,編譯器推斷出模板參數(shù),因此確定調(diào)用的shout是哪個(gè)具體類型的接口。不同的推斷結(jié)果調(diào)用不同的函數(shù),這就是編譯器多態(tài)。這類似于重載函數(shù)在編譯器進(jìn)行推導(dǎo),以確定哪一個(gè)函數(shù)被調(diào)用。   運(yùn)行期多態(tài)與編譯期多態(tài)優(yōu)缺點(diǎn)分析   運(yùn)行期多態(tài)優(yōu)點(diǎn)

OO設(shè)計(jì)中重要的特性,對(duì)客觀世界直覺(jué)認(rèn)識(shí)。

能夠處理同一個(gè)繼承體系下的異質(zhì)類集合。

運(yùn)行期多態(tài)缺點(diǎn)

運(yùn)行期間進(jìn)行虛函數(shù)綁定,提高了程序運(yùn)行開(kāi)銷。

龐大的類繼承層次,對(duì)接口的修改易影響類繼承層次。

由于虛函數(shù)在運(yùn)行期在確定,所以編譯器無(wú)法對(duì)虛函數(shù)進(jìn)行優(yōu)化。

虛表指針增大了對(duì)象體積,類也多了一張?zhí)摵瘮?shù)表,當(dāng)然,這是理所應(yīng)當(dāng)值得付出的資源消耗,列為缺點(diǎn)有點(diǎn)勉強(qiáng)。

編譯期多態(tài)優(yōu)點(diǎn)

它帶來(lái)了泛型編程的概念,使得C++擁有泛型編程與STL這樣的強(qiáng)大武器。

在編譯器完成多態(tài),提高運(yùn)行期效率。

具有很強(qiáng)的適配性與松耦合性,對(duì)于特殊類型可由模板偏特化、全特化來(lái)處理。

編譯期多態(tài)缺點(diǎn)

程序可讀性降低,代碼調(diào)試帶來(lái)困難。

無(wú)法實(shí)現(xiàn)模板的分離編譯,當(dāng)工程很大時(shí),編譯時(shí)間不可小覷。

無(wú)法處理異質(zhì)對(duì)象集合。

關(guān)于顯式接口與隱式接口

所謂的顯式接口是指類繼承層次中定義的接口或是某個(gè)具體類提供的接口,總而言之,我們能夠在源代碼中找到這個(gè)接口.顯式接口以函數(shù)簽名為中心,例如

void AnimalShot(Animal & anim)

{

anim.shout();

}

我們稱shout為一個(gè)顯式接口。在運(yùn)行期多態(tài)中的接口皆為顯式接口。

而對(duì)模板參數(shù)而言,接口是隱式的,奠基于有效表達(dá)式。例如:

template

void AnimalShot(T & anim)

{

anim.shout();

}

對(duì)于anim來(lái)說(shuō),必須支持哪一種接口,要由模板參數(shù)執(zhí)行于anim身上的操作來(lái)決定,在上面這個(gè)例子中,T必須支持shout()操作,那么shout就是T的一個(gè)隱式接口。

關(guān)于C++編譯期多態(tài)與運(yùn)行期多態(tài)是什么樣的問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。


名稱欄目:C++編譯期多態(tài)與運(yùn)行期多態(tài)是什么樣的-創(chuàng)新互聯(lián)
當(dāng)前地址:http://weahome.cn/article/ddjeho.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部