久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx

C++運行期多態和編譯期多態(以不同的模板參數調用不同的函數)

2021-02-06    分類: 網站建設

在面向對象C++編程中,多態是OO三大特性之一,這種多態稱為運行期多態,也稱為動態多態;在泛型編程中,多態基于template(模板)的具現化與函數的重載解析,這種多態在編譯期進行,因此稱為編譯期多態或靜態多態。

該類對象安插一個虛函數表指針,并為類(基類和派生類)設置虛函數表,虛函數表中存放的是該類虛函數地址。同時,改寫虛函數調用代碼(函數指針調用)。運行期間通過虛函數表指針與虛函數表去確定該類虛函數的真正實現。

#include
using namespace std;
class Animal
{
public :virtual void shout() = 0;
};
class Dog :public Animal
{
public:virtual void shout(){ cout << "汪汪!"<shout();//虛函數的調用會被編譯器轉換為對虛函數表的訪問Cat cat;// ② 編譯器會為每個新建對象添加一函數指針,指向虛函數表animal = &cat;animal->shout();//animal代表this指針,shout是虛函數// ③ 編譯器會改寫對象調用成員函數代碼,改寫成指針調用的形式Animal * anim3 = new Bird;anim3->shout();delete anim3;system("pause");return 0;
}
/*
汪汪!
喵喵~
嘰喳!
*/

編譯器會構建一張虛表( vtable ),每一個類都有自己獨特的虛表。同時,在這個繼承鏈上,編譯器會為基類插入一個隱式的指針(一般是對象的首地址),指向虛表,稱為__vptr。然后,子類繼承父類時,會獲得繼承下來的__vptr,再根據自己的類的情況兼容(修改虛函數表里的值、發生偏移等。于是,當我們構建具體的類時,若是基類類型,__vptr就會指向父類的vtable,若是子類類型,__vptr就會指向子類的vtable。


下面再看一個實例來了解虛函數表,及對象的函數指針是如何指向虛函數表以及調用虛函數代碼是如何改寫的?

#include 
using namespace std;
class A
{
public:
 A(int _a1 = 1) : a1(_a1) { }
 virtual void f() { cout << "A::f" << endl; }
 virtual void g() { cout << "A::g" << endl; }
 virtual void h() { cout << "A::h" << endl; }
 ~A() {}
private:
 int a1;
};
class C : public A
{
public:
 C(int _a1 = 1, int _c = 4) :A(_a1), c(_c) { }
 virtual void f() { cout << "C::f" << endl; }
 virtual void g() { cout << "C::g" << endl; }
 virtual void h() { cout << "C::h" << endl; }
private:
 int c;
};
// 通過訪問類對象的前4字節(32位編譯器)找到虛函數表。
// 虛函數表最后一項用的是0,代表虛函數表結束。
typedef void(*FUNC)(); //重定義函數指針,指向函數的指針
void PrintVTable(long* vTable) //訪問虛函數表
{
 if (vTable == NULL)
 {
 return;
 }
 cout << "vtbl:" << vTable << endl;
 int i = 0;
 for (; vTable[i] != 0; ++i)
 {
 printf("function : %d :0X%x->", i, vTable[i]);
 FUNC f = (FUNC)vTable[i];
 f(); //訪問虛函數
 }
 cout << endl;
}
void main()
{A a1;long *p = (long *)(*(long*)&a1);PrintVTable(p);C c;long *p2 = (long *)(*(long*)&c);PrintVTable(p2);system("pause");
}
/*
vtbl:00471048
function : 0 :0X40105a->A::f
function : 1 :0X4012c6->A::g
function : 2 :0X4010b9->A::h
vtbl:00471070
function : 0 :0X4010eb->C::f
function : 1 :0X4011d1->C::g
function : 2 :0X401280->C::h
*/

不同的推斷結果調用不同的函數,這就是編譯器多態。這類似于重載函數在編譯器進行推導,以確定哪一個函數被調用。

3 運行期多態與編譯期多態優缺點分析

3.1 運行期多態優點

OO設計中重要的特性,對客觀世界直覺認識。

能夠處理同一個繼承體系下的異質類集合。

3.2 運行期多態缺點

運行期間進行虛函數綁定,提高了程序運行開銷。

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

由于虛函數在運行期在確定,所以編譯器無法對虛函數進行優化。

虛表指針增大了對象體積,類也多了一張虛函數表,當然,這是理所應當值得付出的資源消耗,列為缺點有點勉強。

3.3 編譯期多態優點

它帶來了泛型編程的概念,使得C++擁有泛型編程與STL這樣的強大武器。

在編譯器完成多態,提高運行期效率。

具有很強的適配性與松耦合性,對于特殊類型可由模板偏特化、全特化來處理。

3.4 編譯期多態缺點

程序可讀性降低,代碼調試帶來困難。

無法實現模板的分離編譯,當工程很大時,編譯時間不可小覷。

無法處理異質對象集合。

文章標題:C++運行期多態和編譯期多態(以不同的模板參數調用不同的函數)
當前地址:http://www.js-pz168.com/news14/99414.html

成都網站建設公司_創新互聯,為您提供域名注冊微信公眾號ChatGPT搜索引擎優化品牌網站建設微信小程序

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

商城網站建設
久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx
青娱乐国产91| 精品噜噜噜噜久久久久久久久试看| 91精品国产91热久久久做人人 | 蜜桃传媒麻豆第一区在线观看| 国产成人精品免费在线| 国产一区二区无遮挡| 91福利视频网站| 久久精品亚洲乱码伦伦中文 | 国产亚洲成av人在线观看导航| 亚洲国产色一区| 国产成人a级片| 欧美日韩成人一区二区三区| 7777精品伊人久久久大香线蕉经典版下载 | 亚洲国内在线| 精品久久久久久久久久久久包黑料| 亚洲精品乱码久久久久久黑人| 极品美女销魂一区二区三区 | 国内外成人在线视频| 国产一级特黄a大片99| 欧美三级中文字| 中文字幕制服丝袜一区二区三区| 麻豆精品视频在线| 国产一级特黄a大片99| 欧美日韩一级片网站| 中文字幕一区二区三区不卡| 国产综合久久久久久久久久久久| 国产私拍一区| 51精品秘密在线观看| 亚洲在线中文字幕| 成人午夜视频免费看| 一区二区免费在线视频| 久久精品视频在线免费观看| 美女视频一区二区| 精品一区日韩成人| 欧美一级生活片| 午夜成人免费电影| 国产成人看片| 欧美高清dvd| 亚洲综合一二区| 91丨九色丨黑人外教| 欧美性感一区二区三区| 亚洲精品亚洲人成人网| eeuss影院一区二区三区| 日本电影欧美片| 亚洲视频在线一区二区| a亚洲天堂av| 在线一区二区视频| 亚洲精品久久久久久国产精华液| 不卡av电影在线播放| 欧美在线观看18| 一区二区三区日本| av一区二区三区四区电影| 欧美精品一级二级| 天堂久久一区二区三区| 国产一区二区在线观看免费播放| 日韩免费福利电影在线观看| 青娱乐精品在线视频| 欧美日韩国产三区| 国产网红主播福利一区二区| 国产成人一级电影| 色婷婷av一区二区三区gif| 亚洲欧美日韩国产一区二区三区| 91香蕉视频黄| 欧美一区二区三区免费在线看| 五月婷婷激情综合| 欧美黑人xxxxx| 国产欧美一区二区精品秋霞影院| 国产高清精品网站| 欧美色图12p| 石原莉奈一区二区三区在线观看| 免费国产一区二区| 国产精品久久久久影视| 91碰在线视频| 欧美成人一级视频| 国产乱对白刺激视频不卡| 一本到不卡免费一区二区| 亚洲精品大片www| 国产日韩一区欧美| 国产亚洲成aⅴ人片在线观看| 风间由美性色一区二区三区| 欧美三级韩国三级日本三斤| 日韩精品成人一区二区三区| 天天综合色天天综合色hd| 亚洲精品自拍动漫在线| 精品国产乱码久久久久久久软件| 国产亚洲欧美日韩日本| 99国产精品国产精品毛片| 日韩午夜在线播放| 国产伦精品一区二区三区在线观看 | 亚洲精品第一区二区三区| 亚洲精品国产高清久久伦理二区| 国产亚洲欧美一区二区| 国产片一区二区| 91浏览器在线视频| 欧美精品一区二区三区久久久| 国v精品久久久网| 欧美一区二区网站| 韩国av一区二区三区| 欧美三级欧美一级| 精品无码三级在线观看视频| 欧洲视频一区二区| 老司机午夜精品| 欧美在线观看一区二区| 麻豆久久一区二区| 欧美日韩一区二区三区四区五区| 麻豆成人久久精品二区三区红 | 日本成人在线网站| 色94色欧美sute亚洲13| 青青草成人在线观看| 91久久久免费一区二区| 久久疯狂做爰流白浆xx| 欧美日韩免费电影| 国产精品资源在线| 日韩精品一区二区三区四区视频| 成人高清在线视频| 久久无码av三级| 成人在线视频网址| 亚洲欧美在线另类| 日本日本精品二区免费| 亚洲va中文字幕| 色偷偷一区二区三区| 蜜桃av一区二区三区电影| 成人av集中营| 精品999在线播放| dy888夜精品国产专区| 国产精品久久久久久久久快鸭| 老司机精品福利在线观看| 一区二区三区四区av| 一区二区三区四区五区视频 | 亚洲一区二区三区色| 蜜臀av一区二区在线观看| 欧美老肥妇做.爰bbww视频| 成人免费视频免费观看| 久久久国产一区二区三区四区小说| av日韩中文字幕| 亚洲精品乱码久久久久久久久| 五月天综合网| 久久se这里有精品| 日韩欧美久久久| 成人永久免费| 一区二区国产视频| 欧洲另类一二三四区| 国产精品一区二区久激情瑜伽| 久久这里都是精品| 国产精品9999久久久久仙踪林| 伊人性伊人情综合网| 91国产丝袜在线播放| 国产91丝袜在线观看| 国产精品免费人成网站| 日韩影院一区| 国内外精品视频| 国产三级三级三级精品8ⅰ区| 美脚丝袜一区二区三区在线观看| 日韩影院在线观看| 日韩你懂的在线观看| 国产精品果冻传媒潘| 亚洲bt欧美bt精品| 在线播放中文一区| 国产精品theporn88| 亚洲成人免费看| 欧美一区二区啪啪| 国产另类自拍| 日本伊人精品一区二区三区观看方式| 在线电影一区二区三区| 粉嫩精品一区二区三区在线观看| 亚洲午夜免费福利视频| 7878成人国产在线观看| 国产伦精品一区二区三区免费视频| 亚洲18色成人| 日韩欧美不卡在线观看视频| 老牛影视免费一区二区| 国内精品久久久久影院一蜜桃| 久久精品免视看| 视频一区二区在线观看| 国产91露脸合集magnet| 亚洲精品视频一区| 911精品产国品一二三产区| 国产精品一区二区三区观看| 日韩黄色一级片| 久久―日本道色综合久久| 亚洲精品成人自拍| av一区二区三区在线| 亚洲国产精品一区二区www| 日韩精品一区国产麻豆| 日本一区二区三区视频在线观看| 国产精品亚洲专一区二区三区| 日韩理论片一区二区| 欧美片在线播放| 久久99精品久久久久久久久久| 精品一区二区在线看| 中文字幕一区二区三区四区不卡| 欧美三级在线看| 久久国产一区| 国产精品一区免费视频| 亚洲免费观看高清| 欧美一二三四在线| 亚州欧美一区三区三区在线| av不卡一区二区三区| 日本成人中文字幕在线视频| 中文字幕不卡在线观看|