十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊
量身定制 + 運營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
C++多繼承多態(tài)的實現(xiàn)
成都創(chuàng)新互聯(lián)一直秉承“誠信做人,踏實做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個客戶多一個朋友!為您提供網(wǎng)站制作、網(wǎng)站建設(shè)、成都網(wǎng)頁設(shè)計、重慶小程序開發(fā)、成都網(wǎng)站開發(fā)、成都網(wǎng)站制作、成都軟件開發(fā)、APP應(yīng)用開發(fā)是成都本地專業(yè)的網(wǎng)站建設(shè)和網(wǎng)站設(shè)計公司,等你一起來見證!
如果一個類中存在虛函數(shù),在聲明類的對象時,編譯器就會給該對象生成一個虛函數(shù)指針,該虛函數(shù)指針指向該類對應(yīng)的虛函數(shù)表。
多態(tài)的實現(xiàn)是因為使用了一種動態(tài)綁定的機制,在編譯期間不確定調(diào)用函數(shù)的地址,在調(diào)用虛函數(shù)的時候,去查詢虛函數(shù)指針?biāo)赶虻奶摵瘮?shù)表。
派生類生成的對象中的虛函數(shù)指針指向的是派生類的虛函數(shù)表,因此無論是基類還是派生來調(diào)用,都是查詢的是派生類的表,調(diào)用的是派生類的函數(shù)。
如果發(fā)生了多繼承,多個基類中都有虛函數(shù),那么該是怎樣的呢?虛函數(shù)指針如何排列,多個基類的指針為什么能夠同時指向派生類對象,同時發(fā)生多態(tài)?
請看下面這段程序
#include#include using namespace std; class Base1{ public: void fun() { printf("this is Base1 fun\n"); } virtual void fun1() { printf("this is Base1 fun1\n"); } }; class Base2{ public: void fun() { printf("this is Base2 fun\n"); } virtual void fun2() { printf("this is Base2 fun1\n"); } }; class Derived : public Base1,public Base2{ public: void fun() { printf("this is Derived fun\n"); } void fun1() { printf("this is Derived fun1\n"); } void fun2() { printf("this is Derived fun2\n"); } }; int main() { Derived *pd = new Derived(); Base1 *p1 = (Base1 *)pd; Base2 *p2 = (Base2 *)pd; p1->fun(); p2->fun(); p1->fun1(); p2->fun2(); printf("Base1 p1:%x\n", p1); printf("Base2 p2:%x\n", p2); return 0; }
運行結(jié)果如下
feng@mint ~/code/c++/cpp_muti_drived $ ./muti_derived this is Base1 fun this is Base2 fun this is Derived fun1 this is Derived fun2 Base1 p1:2097c20 Base2 p2:2097c28
Derived類分別繼承了Base1和Base2,根據(jù)結(jié)果來看,均發(fā)生了多態(tài)?;愔羔樥{(diào)用函數(shù),調(diào)用的均是派生類的對象。
通過打印出了p1和p2的地址,發(fā)現(xiàn)他們相差了8個字節(jié),就能明白了,在做類型轉(zhuǎn)換的過程中,如果把地址傳給第二個基類的指針的時候會自動把地址減去8,在64位系統(tǒng)下,剛好是一個指針的長度。因此p2指向的實際上是第二個虛函數(shù)指針的地址,這樣,就能夠?qū)崿F(xiàn)多繼承的多態(tài)了。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!