單繼承與多繼承中的虛函式表和虛函式指標

2021-08-18 02:13:26 字數 3120 閱讀 8852

編譯環境: vs 2013

首先,我們了解一下何為單繼承,何為多繼承??

單繼承:乙個子類只有乙個直接父類。

多繼承:乙個子類有兩個或多個直接父類。

單繼承中的虛函式表分析:

示例程式:

#include using namespace std;  

typedef void(*func)();

class base

virtual void func2()

private:

int _b;

};

class derive :public base

virtual void func3()

virtual void func4()

private:

int _d;

};

void printvfptr(int* vptr)

//列印虛函式表

} void test()

int main()

程式執行結果:

base類(基類)的虛函式表:

derive類(派生類)的虛函式表:

結論:如果有虛函式表,那麼只有乙個虛函式表,並且按照虛函式宣告的順序順序排列,派生類的虛函式緊接著基類的虛函式排列

。多繼承中的虛函式表分析:

示例**:

#include using namespace std;  

typedef void(*func)();

class base

;

class base1:public base

virtual void func2()

private:

int _b1;

};

class base2: public base

virtual void func2()

private:

int _b2;

};

class derive : public base1, public base2

virtual void func3()

virtual void func4()

private:

int _d;

};

void printvfptr(base* b)

//int* vtable2 = (int*)(*((int*)b + sizeof(base1) / 4));

int* vtable2 = (int*)(*((int*)((char*)b + sizeof(base1))));

cout << "虛函式表指標:" << vtable2 << endl;

for (int i = 0; vtable2[i] != 0; ++i)

}

void test()

int main()

程式執行結果:

base1的虛函式表:

base2的虛函式表:

derive的虛函式表:(有兩個虛函式表)

多繼承中的菱形繼承:

示例**:

#include using namespace std;  

typedef void(*func)();

class base

virtual void func2()

private:

int _b;

};

class parent1 :public base

virtual void func3()

virtual void func4()

virtual void func5()

private:

int _p1;

};

class parent2 :public base

virtual void func3()

virtual void func6()

virtual void func7()

private:

int _p2;

};

class child :public parent1, public parent2

virtual void func3()

virtual void func4()

virtual void func6()

virtual void func8()

private:

int _c;

};

void printvfptr(int* vptr)

//列印虛函式表

} void test()

int main()

執行結果:

總結:多繼承中會有多個虛函式表,幾重繼承就會有幾個虛函式表。這些虛函式表會按照派生的順序依次排列。如果子類改寫了父類的虛函式,那麼就會用子類自己的虛函式覆蓋相應的父類虛函式;如果子類有新的虛函式,那麼就新增到第乙個虛函式表的末尾。

單繼承和多繼承的虛函式表

前面兩篇關於多型的部落格已經詳細介紹了多型的基礎知識點和多型的底層實現原理,下面將主要介紹一下單繼承和多繼承的虛函式表 首先來看一段 class base virtual void func2 private int b 1 class derive public base virtual void...

虛繼承與虛函式表

一 虛繼承 1 include iostream using namespace std class bvoid fb class d1 virtual public bvoid fd1 class d2 virtual public bvirtual void vd2 void fd2 class...

虛函式,虛繼承與虛函式表

c 實現多型機制 模板技術,rtti 技術,虛函式技術,要麼是試圖做到在編譯時決議,要麼試圖做到執行時決議 虛函式 帶有 關鍵字的函式,並且不帶有 標誌的 虛繼承帶有 關鍵字的繼承,基類被稱為虛基類,會在自己物件的例項中產生虛基類指標 虛函式與菱形繼承的問題 當發生繼承時,如果派生類重寫了基類的虛函...