日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++编译时多态和运行时多态

發布時間:2025/3/8 c/c++ 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++编译时多态和运行时多态 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C++編譯時多態和運行時多態

作者:melonstreet
出處:https://www.cnblogs.com/QG-whz/p/5132745.html
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

前言

今日的C++不再是個單純的“帶類的C”語言,它已經發展成為一個多種次語言所組成的語言集合,其中泛型編程與基于它的STL是C++發展中最為出彩的那部分。在面向對象C++編程中,多態是OO三大特性之一,這種多態稱為運行期多態,也稱為動態多態;在泛型編程中,多態基于template(模板)的具現化與函數的重載解析,這種多態在編譯期進行,因此稱為編譯期多態或靜態多態。在本文中,我們將了解:

  • 什么是運行期多態
  • 什么是編譯期多態
  • 它們的優缺點在哪
  • 運行期多態

    運行期多態的設計思想要歸結到類繼承體系的設計上去。對于有相關功能的對象集合,我們總希望能夠抽象出它們共有的功能集合,在基類中將這些功能聲明為虛接口(虛函數),然后由子類繼承基類去重寫這些虛接口,以實現子類特有的具體功能。典型地我們會舉下面這個例子:

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-r8RIXVVw-1642570130701)(C++編譯時多態和運行時多態.assets/poly0.png)]

    class Animal { public :virtual void shout() = 0; }; class Dog :public Animal { public:virtual void shout(){ cout << "汪汪!"<<endl; } }; class Cat :public Animal { public:virtual void shout(){ cout << "喵喵~"<<endl; } }; class Bird : public Animal { public:virtual void shout(){ cout << "嘰喳!"<<endl; } };int main() {Animal * anim1 = new Dog;Animal * anim2 = new Cat;Animal * anim3 = new Bird;//藉由指針(或引用)調用的接口,在運行期確定指針(或引用)所指對象的真正類型,調用該類型對應的接口anim1->shout();anim2->shout();anim3->shout();//delete 對象...return 0; }

    運行期多態的實現依賴于虛函數機制。當某個類聲明了虛函數時,編譯器將為該類對象安插一個虛函數表指針,并為該類設置一張唯一的虛函數表,虛函數表中存放的是該類虛函數地址。運行期間通過虛函數表指針與虛函數表去確定該類虛函數的真正實現。

    運行期多態的優勢還在于它使處理異質對象集合稱為可能:

    //我們有個動物園,里面有一堆動物 int main() {vector<Animal*>anims;Animal * anim1 = new Dog;Animal * anim2 = new Cat;Animal * anim3 = new Bird;Animal * anim4 = new Dog;Animal * anim5 = new Cat;Animal * anim6 = new Bird;//處理異質類集合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; }

    總結:運行期多態通過虛函數發生于運行期

    編譯期多態

    對模板參數而言,多態是通過模板具現化和函數重載解析實現的。以不同的模板參數具現化導致調用不同的函數,這就是所謂的編譯期多態。
    相比較于運行期多態,實現編譯期多態的類之間并不需要成為一個繼承體系,它們之間可以沒有什么關系,但約束是它們都有相同的隱式接口。我們將上面的例子改寫為:

    class Animal { public :void shout() { cout << "發出動物的叫聲" << endl; }; }; class Dog { public:void shout(){ cout << "汪汪!"<<endl; } }; class Cat { public:void shout(){ cout << "喵喵~"<<endl; } }; class Bird { public:void shout(){ cout << "嘰喳!"<<endl; } }; template <typename T> 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 <typename T> void AnimalShot(T & anim) {anim.shout(); }

    對于anim來說,必須支持哪一種接口,要由模板參數執行于anim身上的操作來決定,在上面這個例子中,T必須支持shout()操作,那么shout就是T的一個隱式接口。

    總結

    以上是生活随笔為你收集整理的C++编译时多态和运行时多态的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 五月av综合av国产av | 国产偷人视频 | 伦理黄色片| 99久久视频 | 国产黄色精品视频 | 久久久夜 | 亚洲激情自拍 | 亚洲第一天堂影院 | 国产亚洲精品久久777777 | 中文在线а√在线8 | 影音先锋亚洲精品 | 97视频国产| 中文字幕在线免费看线人 | www.白浆 | 99国产一区 | 亚洲视频色图 | 激情精品 | 午夜少妇久久久久久久久 | 成人国产一区 | 色图自拍 | 亚洲成人第一区 | 毛片88| 国产精品制服丝袜 | av大全网站 | 成人福利一区二区三区 | 亚洲成人1区 | 中文字幕在线观看亚洲 | 中文字幕 国产 | 麻豆疯狂做受xxxx高潮视频 | 久久综合伊人77777麻豆 | 一区二区三区精品免费视频 | 精品国产乱码久久久久久蜜臀 | 色婷婷久久 | 久久xxxx| 国产精品久久久久久久久久久久午夜片 | 啪网址| 国产a级淫片| 性高潮久久久久 | 五月婷婷综合激情网 | 怡红院国产| 国产精品欧美性爱 | 日日摸天天添天天添破 | 网站色| www,超碰 | 国产毛片aaa | 亚洲欧洲在线视频 | 不卡的中文字幕 | 伊人色在线 | 99综合色 | 天堂av在线网 | 精品人妻无码一区二区色欲产成人 | 中文字幕一区二区av | 日韩免费高清一区二区 | 亚洲AV无码国产精品播放在线 | 日本欧美一区二区三区不卡视频 | 亚洲欧美日本在线观看 | 免费的黄色av | 中国特级毛片 | 国产精品久久久久久久久岛 | av在线不卡观看 | 国产精品3 | 国产成人欧美 | 国产一级二级三级 | 人妻av一区二区 | 色婷婷18 | 国精品无码人妻一区二区三区 | 亚洲男人天堂视频 | 亚洲人成人一区二区在线观看 | 美女又爽又黄免费视频 | 免费观看一区 | 国产免费资源 | 好男人天堂网 | 日本黄色片免费看 | 秋霞国产午夜精品免费视频 | 久久久精品一区二区涩爱 | a色网站| 久久青| 亚洲综合色婷婷 | 激情文学综合网 | 欧美一级性视频 | 91免费看黄 | 天堂8中文在线 | 亚洲黄色精品视频 | 青青草成人av| 欧美视频 | 欧美日韩少妇精品 | 96毛片| 精品国产a线一区二区三区东京热 | 疯狂揉花蒂控制高潮h | 美女被c出水| 日本三级黄色大片 | 99视频久 | 亚洲精品字幕在线 | 国产午夜精品久久久久久久久久 | 奇米精品一区二区三区在线观看 | 九九久久国产精品 | 免费在线视频一区 | 男同av在线观看一区二区三区 | 一区二区不卡视频在线观看 |