虛函數(shù)表

代碼

先不說廢話啦,上代碼:

#include<iostream>
#include <stdio.h>
using namespace std;

class B0 {
public:
    virtual void vir1() {cout << "B0::vir1" << endl;}
    virtual void vir2() {cout << "B0::vir2" << endl;}
};

class B1: public B0 {
public:
    virtual void vir1() {cout << "B1::vir1" << endl;}
    virtual void barB1() {cout << "B1::bar" << endl;}
    virtual void fooB1() {cout << "B1::foo" << endl;}
};

class B2: public B0 {
public:
    virtual void vir2() {cout << "B2::vir2" << endl;}
    virtual void barB2() {cout << "B2::bar" << endl;}
    virtual void fooB2() {cout << "B2::foo" << endl;}
};

class D : public B1, B2 {
public:
    void fooB1() {cout << "D::foo" << endl;}
    void barB2() {cout << "D::bar" << endl;}
};

typedef void (*Func)();
int test1() {
    D tt;
    Func* vptr1 = *(Func**)&tt;
    Func* vptr2 = *((Func**)&tt + 1);

    cout<<"============"<<endl;
    vptr1[0]();
    vptr1[1]();
    vptr1[2]();
    vptr1[3]();
    vptr1[4]();
    cout<<"============"<<endl;
    vptr2[0]();
    vptr2[1]();
    vptr2[2]();
    vptr2[3]();
    cout<<"============"<<endl;

    return 0;
}

輸出:

============
B1::vir1
B0::vir2
B1::bar
D::foo
D::bar
============
B0::vir1
B2::vir2
D::bar
B2::foo
============

結(jié)論:

多重繼承會有多個虛函數(shù)表,幾重繼承,就會有幾個虛函數(shù)表。這些表按照派生的順序依次排列,如果子類改寫了父類的虛函數(shù),那么就會用子類自己的虛函數(shù)覆蓋虛函數(shù)表的相應(yīng)的位置,如果子類有新的虛函數(shù),那么就添加到第一個虛函數(shù)表的末尾。

用圖表示

畫了一下圖,大概是這樣:


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容