標籤:多重繼承 c++
參考於上一篇虛函數,多重繼承也分為有無虛函數覆蓋的問題; 在虛表存在著不同的情況
多重繼承(無虛函數覆蓋)
參考虛表:
這裡子類的虛函數地址,添加到第一個繼承的父類的虛表裡面 此外虛表中的 . 地區代表是否 還存在虛表 1 表示還存在虛表,0則表示最後一個虛表;
代碼如下:
#include <iostream>using namespace std;class Base1{ public: virtual void f() { cout << " Base1 :: f() " << endl; } virtual void g() { cout << " Base1 :: g() " << endl; } virtual void h() { cout << " Base1 :: h() " << endl; }};class Base2{ public: virtual void f() { cout << " Base2 :: f() " << endl; } virtual void g() { cout << " Base2 :: g() " << endl; } virtual void h() { cout << " Base2 :: h() " << endl; }};class Base3{ public: virtual void f() { cout << " Base3 :: f() " << endl; } virtual void g() { cout << " Base3 :: g() " << endl; } virtual void h() { cout << " Base3 :: h() " << endl; }};class Derived:public Base2,public Base1,public Base3{ public: virtual void f1() { cout << " Derived:: f1() " << endl; } virtual void g1() { cout << "Derived:: g1() " << endl; }};typedef void(*Fun)(void);//函數指標 存放地址 知道地址 調用函數int main(){ Derived d; Fun pFun = NULL; int** pVtab = (int**)(&d); //Base1's virtual table pFun = (Fun)pVtab[0][0]; pFun(); pFun = (Fun)pVtab[0][1]; pFun(); pFun = (Fun)pVtab[0][2]; pFun(); pFun = (Fun)pVtab[0][3]; pFun(); pFun = (Fun)pVtab[0][4]; pFun(); cout << pFun << endl; //Base2's virtual table pFun = (Fun)pVtab[1][0]; pFun(); pFun = (Fun)pVtab[1][1]; pFun(); pFun = (Fun)pVtab[1][2]; pFun(); pFun = (Fun)pVtab[1][3]; cout << pFun << endl; //Base3's virtual table pFun = (Fun)pVtab[2][0]; pFun(); pFun = (Fun)pVtab[2][1]; pFun(); pFun = (Fun)pVtab[2][2]; pFun(); pFun = (Fun)pVtab[2][3]; cout << pFun << endl; return 0;}輸出的結果 對應於前面的 虛表:先繼承Base2 先輸出(繼承順序)
有虛函數的覆蓋:
此時對應的虛表:
測試代碼:
#include <iostream>using namespace std;class Base1{ public: virtual void f() { cout << " Base1 :: f() " << endl; } virtual void g() { cout << " Base1 :: g() " << endl; } virtual void h() { cout << " Base1 :: h() " << endl; }};class Base2{ public: virtual void f() { cout << " Base2 :: f() " << endl; } virtual void g() { cout << " Base2 :: g() " << endl; } virtual void h() { cout << " Base2 :: h() " << endl; }};class Base3{ public: virtual void f() { cout << " Base3 :: f() " << endl; } virtual void g() { cout << " Base3 :: g() " << endl; } virtual void h() { cout << " Base3 :: h() " << endl; }};class Derived:public Base2,public Base1,public Base3{ public: virtual void f() { cout << " Derived:: f1() " << endl; } virtual void g1() { cout << "Derived:: g1() " << endl; }};typedef void(*Fun)(void);//函數指標 存放地址 知道地址 調用函數int main(){ Derived d; Fun pFun = NULL; int** pVtab = (int**)(&d); //Base1's virtual table pFun = (Fun)pVtab[0][0]; pFun(); pFun = (Fun)pVtab[0][1]; pFun(); pFun = (Fun)pVtab[0][2]; pFun(); pFun = (Fun)pVtab[0][3]; pFun(); pFun = (Fun)pVtab[0][4]; //pFun(); cout << pFun << endl; //Base2's virtual table pFun = (Fun)pVtab[1][0]; pFun(); pFun = (Fun)pVtab[1][1]; pFun(); pFun = (Fun)pVtab[1][2]; pFun(); pFun = (Fun)pVtab[1][3]; cout << pFun << endl; //Base3's virtual table pFun = (Fun)pVtab[2][0]; pFun(); pFun = (Fun)pVtab[2][1]; pFun(); pFun = (Fun)pVtab[2][2]; pFun(); pFun = (Fun)pVtab[2][3]; cout << pFun << endl; return 0;}運行結果 如下:
父類的f()函數的位置被子類的f()覆蓋。對應於上面的虛表;
C++ 多重繼承