C++類的繼承關係——多繼承(未重寫虛擬函式)
阿新 • • 發佈:2019-01-10
首先,在介紹有虛擬函式的多繼承(未重寫虛擬函式),先介紹一下以下概念。
多型:多種形態,簡單地說父類的指標或引用呼叫重寫的虛擬函式,當父類的指標或引用指向父類物件呼叫的就是父類的虛擬函式,指向子類物件時呼叫的就是是子類的虛擬函式
虛擬函式:C++中虛擬函式的主要作用就是實現多型, 在一個類的成員函式前面加上virtual關鍵字,該函式就被定義成虛擬函式,虛擬函式的地址存放在虛表(存放虛擬函式地址的表,虛表的地址存放在所定義物件中)
那麼,當一個子類有多個父類,子類的虛表會放在什麼位置?
請看下例:
class Base { public: virtual void FunTest1() { cout << "Base::FunTest1()" << endl; } virtual void FunTest2() { cout << "Base::FunTest2()" << endl; } int _data1; }; class Base1 { public: virtual void FunTest3() { cout << "Base1::FunTest3()" << endl; } virtual void FunTest4() { cout << "Base1::FunTest4()" << endl; } int _data2; }; class Derive :public Base, public Base1 { public: virtual void FunTest5() { cout << "Derive::FunTest5()" << endl; } int _data3; }; typedef void(*VtbFun)(); void PrintVtable() { Derive d1; d1._data1 = 0x01; d1._data2 = 0x02; int* pVTable = (int *)*(int*)&d1; VtbFun FunTest = (VtbFun)*pVTable; while (NULL != FunTest) { FunTest(); cout << (int*)FunTest << endl; pVTable += 1; FunTest = (VtbFun)*pVTable; } } int main() { Derive d; d._data1 = 0x01; d._data2 = 0x02; d._data3 = 0x03; PrintVtable(); return 0; }