C++多繼承多態(tài)的實例詳解
C++多繼承多態(tài)的實現(xiàn)
如果一個類中存在虛函數(shù),在聲明類的對象時,編譯器就會給該對象生成一個虛函數(shù)指針,該虛函數(shù)指針指向該類對應(yīng)的虛函數(shù)表。
多態(tài)的實現(xiàn)是因為使用了一種動態(tài)綁定的機(jī)制,在編譯期間不確定調(diào)用函數(shù)的地址,在調(diào)用虛函數(shù)的時候,去查詢虛函數(shù)指針?biāo)赶虻奶摵瘮?shù)表。
派生類生成的對象中的虛函數(shù)指針指向的是派生類的虛函數(shù)表,因此無論是基類還是派生來調(diào)用,都是查詢的是派生類的表,調(diào)用的是派生類的函數(shù)。
如果發(fā)生了多繼承,多個基類中都有虛函數(shù),那么該是怎樣的呢?虛函數(shù)指針如何排列,多個基類的指針為什么能夠同時指向派生類對象,同時發(fā)生多態(tài)?
請看下面這段程序
#include <stdio.h>
#include <iostream>
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)了。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Java C++題解leetcode856括號的分?jǐn)?shù)
這篇文章主要為大家介紹了Java C++題解leetcode856括號的分?jǐn)?shù)實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
C語言中g(shù)etopt()函數(shù)和select()函數(shù)的使用方法
這篇文章主要介紹了C語言中g(shù)etopt()函數(shù)和select()函數(shù)的使用方法,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09
C語言深入分析數(shù)組指針和指針數(shù)組的應(yīng)用
在C語言和C++等語言中,數(shù)組元素全為指針變量的數(shù)組稱為指針數(shù)組,指針數(shù)組中的元素都必須具有相同的存儲類型、指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組比較適合用來指向若干個字符串,使字符串處理更加方便、靈活2022-04-04
C++ COM編程之QueryInterface函數(shù)(一)
這篇文章主要介紹了C++ COM編程之QueryInterface函數(shù)(一),QueryInterface是組件本身提供對自己查詢的一個接口,需要的朋友可以參考下2014-10-10
C++關(guān)鍵字之likely和unlikely詳解
這篇文章主要介紹了C++關(guān)鍵字之likely和unlikely,C++20之前的,likely和unlikely只不過是一對自定義的宏,而C++20中正式將likely和unlikely確定為屬性關(guān)鍵字,本文給大家詳細(xì)講解,需要的朋友可以參考下2022-10-10

