亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

[Boolan] C++第五周學習筆記

2019-11-08 01:46:41
字體:
來源:轉載
供稿:網友

1.關于vptr和vtbl

    之前的學習已經了解到c++多態主要靠虛函數實現,如果說c++的class在實現上相比c的struct有什么開銷的話,那么虛函數表(vtbl)的維護和每個對象實例里虛表指針(vptr)將是比較明顯的開銷。

    對于如下三個類

class A {public:	virtual void vfunc1() { cout << "A::vfunc1/n"; }	virtual void vfunc2() { cout << "A::vfunc2/n"; }	void func1() { cout << "A::func1/n"; }	void func2() { cout << "A::func2/n"; }};class B : public A {public:	virtual void vfunc1() { cout << "B::vfunc1/n"; }	void funcb() { cout << "B::funcb/n"; }};class C : public B {public:	virtual void vfunc1() { cout << "C::vfunc1/n"; }	void funcc() { cout << "C::funcc/n"; }};

    非虛成員函數:A::func1(),A::func2(),B::funcb(),C::funcc()會單獨在內存里存一份

    虛成員函數:A::vfunc1(),A::vfunc2(),B::vfunc1(),C::vfunc1()也會單獨存一份,但是這四個虛函數會由虛函數表來記錄,由于這個例子里有三個類,因此內存里會有三份虛函數B::vfunc1(),A::vfunc2(),表,我們假設它們為A,B,C表。 A表里會有兩個指針,分別指向A::vfunc1(),A::vfunc2()的地址,B表里兩個指針,分別指向B::vfunc1(),A::vfunc2(),同理,C表里的指針指向C::vfunc1(),A::vfunc2()。   

    對于用基類指針new子類的情況:A *pa = new B; 這個實例對象里放的也是B類對應的虛函數表,因為編譯器做了個向上轉型(upcasting)。

    其實理解了虛函數表在內存的形式后,調用虛函數的代碼可以這么表示: (*(pa->vptr)[n])(pa) 因為第一個參數肯定是*this。

    學習群里u6th9d當時給我們提供了一些虛函數相關考驗題

	Cat cat("cat");	Dog dog("dog");	Animal* pcat = &cat;	Animal* pdog = &dog;	std::cout << "L01: ";	pcat->say();	std::cout << "L02: ";	pdog->say();	std::cout << "L03: ";	cat.say();	std::cout << "L04: ";	dog.say();	void* tmp = ((void**)pcat)[0];	((void**)pcat)[0] = ((void**)pdog)[0];	((void**)pdog)[0] = tmp;	std::cout << "L05: ";	pcat->say();	std::cout << "L06: ";	pdog->say();	std::cout << "L07: ";	cat.say();	std::cout << "L08: ";	dog.say();

    之前也提到,成員對象的第一個內容是虛表,因此中間那段就是交換了對象里的虛表指針,使得*pcat里的vptr指向Dog類的vtbl,*pdog的vptr指向Cat類的vtbl,結果:

L01: cat miaomiao~~L02: dog wangwang~~L03: cat miaomiao~~L04: dog wangwang~~L05: cat wangwang~~L06: dog miaomiao~~L07: cat miaomiao~~L08: dog wangwang~~

    L05和L06確實交換了,但是L07和L08并沒有表,我當時沒弄清楚,續表指針不是都變了嗎?為什么調用的還是原來的函數呢?原因在于對動態綁定的理解

2.動態綁定

    為了C++的多態性,是有動態綁定和靜態綁定這兩種說法的:

    靜態綁定:綁定的對象是靜態類型,也就是編譯期就能決定的,是確定的,不會更改的,比如 A a; a的內容雖然會在運行期發生改變,但是a就是a,這點是不會變的。

    動態綁定:綁定的對象是動態類型,動態類型就是指在編譯期無法決定的,因為它可能在運行期發生改變,比如指針:A* pa; pa可以在運行時重新指向其他對象,或者轉型指向B類或者C類。

    這邊文章很好地總結了靜態綁定和動態綁定:https://www.oschina.net/question/54100_20313

    通過vptr和vtbl實現虛函數是基于動態綁定的,因此基于指針調用的虛函數pcat,pdog調用的函數會隨著虛表指針的改變發生改變,但是用過普通對象直接調用,例如L07和L08,這是靜態綁定,在編譯期就已經決定了要調用的函數,因此不會改變。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美在线播放| 欧美一区在线直播| 成人黄在线观看| 亚洲欧美精品一区二区| 九九综合九九综合| 91亚洲va在线va天堂va国| 91精品久久久久久久久久| 欧美一级淫片丝袜脚交| 51视频国产精品一区二区| 欧美亚洲日本黄色| 精品香蕉在线观看视频一| 国产91精品在线播放| 欧美午夜精品久久久久久久| 亚洲网站在线看| 91网在线免费观看| 亚洲男人天堂2019| 中文字幕国产亚洲| 激情久久av一区av二区av三区| 91亚洲精品一区二区| 亚洲久久久久久久久久久| 亚洲乱码国产乱码精品精| 成人午夜一级二级三级| 国产日韩在线精品av| 亚洲人成77777在线观看网| 久久天堂电影网| 日本精品免费一区二区三区| 欧美激情第三页| 欧美一乱一性一交一视频| 国产日韩在线观看av| 亚洲欧美在线x视频| 久久精品成人动漫| 国产精品久久久久久影视| 国产精品成人一区| 亚洲男女自偷自拍图片另类| 色偷偷av亚洲男人的天堂| 午夜精品一区二区三区在线视频| 国产久一一精品| 成人黄色在线免费| 日韩风俗一区 二区| 久久久久久97| 国产在线一区二区三区| 国产精品视频26uuu| 国产精品18久久久久久麻辣| 久久天天躁狠狠躁夜夜av| 国产欧亚日韩视频| 在线观看欧美成人| 国产欧美精品一区二区| 国产xxx69麻豆国语对白| 久久99精品视频一区97| 亚洲国产日韩欧美综合久久| 91在线视频导航| 国产一区二中文字幕在线看| 国产亚洲欧美日韩美女| 成人免费高清完整版在线观看| 久久精品久久久久| 国产欧美日韩精品在线观看| 成人久久一区二区| 日韩欧美国产激情| 欧美精品手机在线| 91在线观看免费高清完整版在线观看| 91极品女神在线| 精品国产精品自拍| 成人福利网站在线观看11| 欧美福利视频网站| 国产精品老女人精品视频| 亚洲国产精品专区久久| 久久久国产视频| 国产日韩欧美日韩大片| 国产精品久久久久免费a∨大胸| 欧美怡春院一区二区三区| 欧美老女人在线视频| 国产一区视频在线| 国产精品盗摄久久久| 日韩欧美中文字幕在线播放| 日韩成人中文电影| 欧美日韩国产页| 国产精品影院在线观看| 欧美性69xxxx肥| 亚洲精品成人久久| 大量国产精品视频| 国产精品黄色影片导航在线观看| 久久在线免费观看视频| 亚洲人成自拍网站| 91av视频在线免费观看| 久久这里有精品视频| 国产日韩欧美日韩大片| 国产精品女主播| 久久免费视频在线观看| 亚洲成人精品视频在线观看| 中文字幕亚洲欧美日韩在线不卡| 国产精品美女av| 精品国产一区二区三区久久久狼| 日韩精品中文字幕在线观看| 国产精品久久久久免费a∨大胸| 亚洲国产欧美一区二区三区同亚洲| 亚洲午夜av久久乱码| 韩国v欧美v日本v亚洲| 中文字幕亚洲综合| 中文字幕久热精品在线视频| 欧美多人爱爱视频网站| 欧洲成人性视频| 久久视频中文字幕| 久久夜色精品国产欧美乱| 国产精品午夜国产小视频| 国产亚洲精品久久久久动| 性色av一区二区咪爱| 国内外成人免费激情在线视频网站| 亚洲中国色老太| 亚洲色图第三页| 国内精品小视频在线观看| 日韩av电影院| 日韩视频永久免费观看| 久久久久久久999| 91亚洲精品在线| 国产精品日韩欧美综合| 4p变态网欧美系列| 亚洲bt欧美bt日本bt| 狠狠躁天天躁日日躁欧美| 久久精品国产久精国产一老狼| 91久久精品视频| 亚洲国产精品中文| 久久免费成人精品视频| 中文字幕少妇一区二区三区| 国产精品aaaa| 91av在线播放视频| 久久精品国产精品| 最近2019年好看中文字幕视频| 亚洲石原莉奈一区二区在线观看| 亚洲欧美国产精品久久久久久久| 91精品啪aⅴ在线观看国产| 欧美一级淫片videoshd| 国产一区二区动漫| 欧美激情中文字幕乱码免费| 欧美电影在线免费观看网站| 2020欧美日韩在线视频| 久久久久久国产三级电影| 国产精品视频xxxx| 国产精品视频久久| 久久久久久91香蕉国产| 成人国产在线激情| 亚洲国产精品国自产拍av秋霞| 国内外成人免费激情在线视频| 精品国产一区久久久| 精品国产欧美一区二区五十路| 伊人久久综合97精品| 国产精品久久久久久av下载红粉| 国产精品久久久久久久久久ktv| 国产精品第2页| 国产精品免费看久久久香蕉| 91av在线国产| 亚洲日本aⅴ片在线观看香蕉| 91亚洲国产成人久久精品网站| 久久久精品在线| 91亚洲精品久久久| www.亚洲成人| 久久久成人精品| 青青草一区二区| 日韩av一卡二卡| 欧美精品第一页在线播放| 亚洲国产精彩中文乱码av| 精品久久中文字幕久久av| 成人伊人精品色xxxx视频| 成人福利视频网| 97久久超碰福利国产精品…|