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

首頁 > 學院 > 開發設計 > 正文

細談C++多態性的“動”與“靜”

2019-11-17 05:28:08
字體:
來源:轉載
供稿:網友

  在我們討論多態的時候,先看看什么是硬編碼和軟編碼:硬編碼就是把代碼寫死了,導致彈性不足,降低了可擴展性,例如在代碼里的
if...else...;switch...case...

  這些代碼通常都屬于硬編碼,項目中的這些代碼多了,就相當于說明這個代碼的靈活性、擴展性、彈性等等的少了。

  所以,我們要盡量使用軟編碼,通俗點就是“別把話說死了,留點轉彎的余地”。多態性就是這種軟編碼特性的反映,下面我們一起來研究一下多態性。

  多態性是一種抽象,把事物的特征抽象出來,然后事物的具體形態我們就不關心了。

  例如對工人這種事物來說,他的特征就是工作,至于是什么工人,他做什么工作,我們就不用關心了,只要我們以“工人.工作”這種方式去調用。那他就會為我們工作了。

  那為什么我們不抽象出其他的特征,只抽象出工作這個特征呢?因為我們只對這個特征感愛好,他的什么吃飯、睡覺、如廁等的特性我們都不關心了。有了多態,我們就可以實現軟編碼了!

  講解了多態的概念之后,我們來看看多態的實現(C++的實現):

  多態的實現是通過虛函數表(VTable),每個類假如有虛函數,那它就有一個虛函數表,所有的對象都共享這一個VTable。這個概念也叫做動態聯編,還有靜態聯編,這些概念都是通過在程序執行的時候表現出來的性質來定的,我們下面會看看它的“動”和“靜”究竟體現在哪里。

  先看一段代碼:

class C0
...{
public:
void Test()
...{
cout << "call C0 Test()。" << endl;
}
};
  這個類沒有虛函數,調用的時候就是靜態調用。調用的代碼如下:

// 靜態編譯(早綁定 early binding)
C0 *pO0;
C0 obj0;
pO0 = &obj0;
pO0->Test();
它的反匯編代碼如下:

// 直接調用函數(已經知道地址)
00401432 mov ecx,dWord ptr [ebp-0Ch]
00401435 call @ILT+160(C0::Test) (004010a5)
下面看看帶虛函數的類:

class C1
...{
public:
virtual void Test()
...{
cout << "call C1 Test()" << endl;
}
};

class C11 : public C1
...{
public:
void Test()
...{
cout << "call C11 Test()" << endl;
}
};
  它的調用:

C11 obj11;

C1 *pObj1;
pObj1 = &obj11;
// 這里生成的匯編代碼
// 0040144A lea edx,[ebp-14h] // 尋址找到pObj1
// 0040144D mov dword ptr [ebp-1Ch],edx

pObj1->Test();
// 這里生成的匯編代碼
// 00401450 mov eax,dword ptr [ebp-1Ch] // 取得虛表地址
// 00401453 mov edx,dword ptr [eax]
// 00401455 mov esi,esp
// 00401457 mov ecx,dword ptr [ebp-1Ch] // 根據虛表的位置來取得Test()函數
// 0040145A call dword ptr [edx] // 調用Test()函數
  根據上述的匯編代碼,我們可以知道,在多態調用函數的時候,程序執行以下步驟:

  1、尋址找到pObj1

  2、由于C11重載了Test虛函數,所以*pObj1指向的就是C11的VTable的地址

  3、調用pObj1->Test()時,程序通過Vptr(虛表的指針,對象的首地址),找到VTable,再根據偏移調用Test函數。

  由于上述的多態調用過程是一個動態的過程(在運行時去“找”函數來調用),而不是編譯完就直接把函數地址擺在那里了,所以被稱作“動態聯編”。

  上面把多態的“動”和“靜”的特點結合代碼說了一遍,希望能說清楚了。

  下面再驗證一個類的虛表的問題,假如你對虛表已經很熟悉了,就不用再往下看了。

  在很多書上都已經說明了C++的對象模型,這里只是做個驗證。看看這段代碼:

class C1
...{
public:
virtual void Test()
...{
cout << "call C1 Test()" << endl;
}
};

class C11 : public C1
...{
public:
void Test()
...{
cout << "call C11 Test()" << endl;
}
};

class C12 : public C1
...{
public:
void Test()
...{
cout << "call C12 Test()" << endl;
}
};
  我們可以知道 Test() 是虛函數,從C1派生的類必定有自己的虛表。而且根據別的資料,虛表指針是放在對象的首地址的,我們下面就來驗證一下:


// 驗證首地址
C11 obj110;
C11 obj111;

printf("obj111 的地址:%x ", &obj111);
printf("obj110 虛表的地址:%x ", *(&obj110));
printf("obj111 虛表的地址:%x ", *(&obj111));
  結果是:

  obj110 的地址:12ff7c
  obj111 的地址:12ff78
  obj110 虛表的地址:432098
  obj111 虛表的地址:432098

  由上面的結果我們可以驗證:

  1、一個類一個VTABLE,而不是一個對象一個VTABLE。

  2、對象的首地址的內容就是VTABLE的地址。

  總結一下:

  C++的多態性包括其概念和實現,本文從編譯器生成的代碼來討論C++多態特性,非凡說明了為什么多態特性被稱為“動態聯編”,它和“靜態聯編”有什么不同,它們的“動”與“靜”體現在哪里。另外還對對象的虛表做了些驗證。好了,希望本文能對你熟悉C++的多態性有一定的幫助!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
xxxxxxxxx欧美| 欧美国产日韩一区二区| 精品久久久视频| 久久艹在线视频| 91免费福利视频| 成人久久一区二区三区| 91在线观看欧美日韩| 精品国产欧美一区二区三区成人| 91美女福利视频高清| 日韩禁在线播放| 久久久国产精品一区| 不卡中文字幕av| 国产精品极品尤物在线观看| 国产精品久久久久久av福利| 欧洲成人在线视频| 97在线免费观看| 九九视频直播综合网| 日韩欧美在线看| 亚洲国产欧美日韩精品| 精品久久久久久中文字幕一区奶水| 欧美精品久久久久久久| 日韩成人网免费视频| 91高清在线免费观看| 精品美女国产在线| 88xx成人精品| 国产在线精品一区免费香蕉| 亚洲精品资源美女情侣酒店| 精品日韩美女的视频高清| 久久精品视频中文字幕| 亚洲国产毛片完整版| 久久免费福利视频| 国产女同一区二区| 国产精品亚洲美女av网站| 国产成人综合一区二区三区| 热久久免费国产视频| 欧美午夜宅男影院在线观看| 伊人亚洲福利一区二区三区| 亚洲天堂免费在线| 欧美成人精品xxx| 亚洲风情亚aⅴ在线发布| 欧美在线观看日本一区| 成人做爰www免费看视频网站| 国产成人精品一区二区三区| 欧美亚洲国产视频| 亚洲欧洲日产国码av系列天堂| 国产欧美婷婷中文| 国产日韩欧美电影在线观看| 欧美成人激情图片网| 91亚洲精品视频| 韩国国内大量揄拍精品视频| 欧美精品免费播放| 欧美精品videossex性护士| 国产精品第3页| 狠狠色狠狠色综合日日五| 亚洲欧美国产另类| 亚洲精品永久免费| 亚洲石原莉奈一区二区在线观看| 伊人久久五月天| 国产精品无码专区在线观看| 亚洲精品久久久久中文字幕二区| 亚洲国产精品小视频| 中文字幕在线亚洲| 亚洲男子天堂网| 国产91网红主播在线观看| 国产欧美精品xxxx另类| 美日韩精品视频免费看| 一区二区三区视频观看| 欧美色xxxx| 国产精品色午夜在线观看| 亚洲的天堂在线中文字幕| 久久久亚洲网站| 精品香蕉一区二区三区| 在线国产精品播放| 成人av在线天堂| 97精品国产aⅴ7777| 91国偷自产一区二区三区的观看方式| 成人亚洲激情网| 永久免费看mv网站入口亚洲| 精品国产乱码久久久久酒店| 亚洲精品久久久久久下一站| 高清日韩电视剧大全免费播放在线观看| 日韩av第一页| 国产97在线观看| 成人97在线观看视频| 黄色一区二区在线| 亚洲欧美日韩另类| 久久久久久av| 欧美成人剧情片在线观看| 欧美一级高清免费| 日韩一区av在线| 最近的2019中文字幕免费一页| 日韩在线中文字幕| 性欧美xxxx视频在线观看| 久久艳片www.17c.com| 奇米一区二区三区四区久久| 国产一区二区三区在线| 久久久久久久久久国产精品| 欧美亚洲视频在线观看| 国产香蕉一区二区三区在线视频| 精品偷拍各种wc美女嘘嘘| 91爱爱小视频k| 国产精品第一区| 欧美激情久久久久久| 日韩高清av在线| 91在线网站视频| 狠狠躁18三区二区一区| 欧美精品一本久久男人的天堂| 成人性教育视频在线观看| 亚洲欧美国产精品久久久久久久| 91精品久久久久久久| 久久精品在线视频| 久久亚洲精品一区二区| 国产精品91免费在线| 精品国产成人在线| 91精品视频在线免费观看| 性欧美在线看片a免费观看| 国产欧美一区二区三区视频| 日韩视频免费中文字幕| 国模gogo一区二区大胆私拍| 国产精品入口日韩视频大尺度| 欧美成人免费全部观看天天性色| 中文字幕国产精品| 国产成人精品免费久久久久| 久久亚洲成人精品| 国产成人一区二区三区| 97色在线观看| 亚洲一区二区三区在线视频| 国产国语刺激对白av不卡| 亚洲欧美另类人妖| 国产精品视频播放| 国产精品第一页在线| 97高清免费视频| 欧美电影在线免费观看网站| 欧美整片在线观看| 亚洲激情在线观看视频免费| 亚洲国产女人aaa毛片在线| 日韩精品中文在线观看| 97在线观看免费高清| 亚洲www在线观看| 中文字幕精品www乱入免费视频| 亚洲视频国产视频| 九九热精品视频国产| 91精品啪在线观看麻豆免费| 亚洲欧美日韩精品久久| 国a精品视频大全| 97成人精品区在线播放| 国产精品情侣自拍| 国模视频一区二区| 亚洲综合在线做性| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲精品资源美女情侣酒店| 欧美福利视频在线观看| 国产精品久久久久久久一区探花| 久久人人爽人人爽人人片av高清| 国产精品国产自产拍高清av水多| 欧美日韩成人黄色| 国产精品免费久久久久影院| 45www国产精品网站| 人体精品一二三区| 91热精品视频| 亚洲视频在线视频| 91国产中文字幕| 亚洲免费电影一区| 日本精品在线视频|