成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

淺析C++多態(tài)及其實(shí)現(xiàn)模式-創(chuàng)新互聯(lián)

一. 多態(tài)的實(shí)現(xiàn)--虛表

創(chuàng)新互聯(lián)基于成都重慶香港及美國等地區(qū)分布式IDC機(jī)房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動(dòng)大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專業(yè)服務(wù)器托管報(bào)價(jià),主機(jī)托管價(jià)格性價(jià)比高,為金融證券行業(yè)西部信息機(jī)房,ai人工智能服務(wù)器托管提供bgp線路100M獨(dú)享,G口帶寬及機(jī)柜租用的專業(yè)成都idc公司。

      1.多態(tài)就是多種形態(tài)。在C++中,對(duì)同一父類和子類構(gòu)造出的不同對(duì)象發(fā)出同一條指令,需要它們完成不同的工作,就需要在父類和子類寫出相同函數(shù)名的函數(shù)方法,并用虛函數(shù)區(qū)分它們。父類的指針/引用調(diào)用重寫的虛函數(shù),當(dāng)父類指針/引用指向父類對(duì)象時(shí)調(diào)用的是父類的虛函數(shù),指向子類對(duì)象時(shí)調(diào)用的是子類的虛函數(shù)。

     2.虛函數(shù)表是通過一塊連續(xù)內(nèi)存來存儲(chǔ)虛函數(shù)的地址。這張表解決了繼承、虛函數(shù)(重寫)的問題。在有虛函數(shù)的對(duì)象實(shí)例中都存在一張?zhí)摵瘮?shù)表,虛函數(shù)表就像一張地圖,指明了實(shí)際應(yīng)該調(diào)用的虛函數(shù)函數(shù)。

//帶虛函數(shù)的類
class Base
{
public:
    virtual void func1()
    {
        cout << "Base::func1()" << endl;
    }
    virtual void func2()
    {
        cout << "Base::func2()" << endl;
    }
private:
    int a;
};
void Test1()
{
    Base b1;
}

     3.帶虛函數(shù)的類的模型結(jié)構(gòu)

淺析C++多態(tài)及其實(shí)現(xiàn)模式

     4.同一類的對(duì)象共用同一虛表

void Test2()
{
    Base b1, b2, b3;
}

淺析C++多態(tài)及其實(shí)現(xiàn)模式

二. 單繼承&多繼承的對(duì)象模型

    1.單繼承:

class Base
{
public:
    virtual void func1()
    {
        cout << "Base::func1()" << endl;
    }
    virtual void func2()
    {
        cout << "Base::func2()" << endl;
    }
private:
    int a;
};
class Derive :public Base
{
public:
    virtual void func1()
    {
        cout << "Derive::func1" << endl;
    }

    virtual void func3()
    {
        cout << "Derive::func3" << endl;
    }

    virtual void func4()
    {
        cout << "Derive::func4" << endl;
    }

private:
    int b;
};

typedef void(*FUNC) ();

void PrintVTable(int* VTable)
{
    cout << " 虛表地址>" << VTable << endl;
    for (int i = 0; VTable[i] != 0; ++i)
    {
        printf(" 第%d個(gè)虛函數(shù)地址 :0X%x,->", i, VTable[i]);
        FUNC f = (FUNC)VTable[i];
        f();
    }
    cout << endl;
}
void Test1()
{
    Base b1;
    Derive d1;
    int* VTable1 = (int*)(*(int*)&b1);
    int* VTable2 = (int*)(*(int*)&d1);
    PrintVTable(VTable1);
    PrintVTable(VTable2);
}

淺析C++多態(tài)及其實(shí)現(xiàn)模式

   2.多繼承

class Base1
{
public:
    virtual void func1()
    {
        cout << "Base1::func1" << endl;
    }

    virtual void func2()
    {
        cout << "Base1::func2" << endl;
    }

private:
    int b1;
};

class Base2
{
public:
    virtual void func1()
    {
        cout << "Base2::func1" << endl;
    }

    virtual void func2()
    {
        cout << "Base2::func2" << endl;
    }

private:
    int b2;
};


class Derive : public Base1, public Base2
{
public:
    virtual void func1()
    {
        cout << "Derive::func1" << endl;
    }

    virtual void func3()
    {
        cout << "Derive::func3" << endl;
    }

private:
    int d1;
};

typedef void(*FUNC) ();

void PrintVTable(int* VTable)
{
    cout << " 虛表地址>" << VTable << endl;

    for (int i = 0; VTable[i] != 0; ++i)
    {
        printf(" 第%d個(gè)虛函數(shù)地址 :0X%x,->", i, VTable[i]);
        FUNC f = (FUNC)VTable[i];
        f();
    }

    cout << endl;
}

void Test1()
{
    Derive d1;
    int* VTable = (int*)(*(int*)&d1);
    PrintVTable(VTable);
    // Base2虛函數(shù)表在對(duì)象Base1后面
    VTable = (int *)(*((int*)&d1 + sizeof(Base1) / 4));
    PrintVTable(VTable);
}

淺析C++多態(tài)及其實(shí)現(xiàn)模式

三. 靜態(tài)多態(tài)和動(dòng)態(tài)多態(tài)

     1.靜態(tài)多態(tài)就是重載,因?yàn)槭窃诰幾g期決議確定,所以稱為靜態(tài)多態(tài)。

      2.動(dòng)態(tài)多態(tài)就是通過繼承重寫基類的虛函數(shù)實(shí)現(xiàn)的多態(tài),因?yàn)槭窃谶\(yùn)行時(shí)決議確定,所以稱為動(dòng)態(tài)多態(tài)。

class Base
{
public:
    virtual void func1()
    {
        cout << "Base::func1" << endl;
    }

    virtual void func2()
    {
        cout << "Base::func2" << endl;
    }

    void display()
    {
        cout << "display()" << endl;
    }

    void display(int i)
    {
        cout << "display(int i)->" << i << endl;
    }

private:
    int a;
};

class Derive :public Base
{
public:
    virtual void func1()
    {
        cout << "Derive::func1" << endl;
    }

    virtual void func3()
    {
        cout << "Derive::func3" << endl;
    }

    virtual void func4()
    {
        cout << "Derive::func4" << endl;
    }

private:
    int b;
};

void func(Base& b)
{
    b.func1();
    b.display();
    b.display(10);
}

void Test1()
{
    Base b1;
    Derive d1;
    func(b1);
    func(d1);
}

淺析C++多態(tài)及其實(shí)現(xiàn)模式

四. 菱形虛擬繼承的對(duì)象模型

class A
{
public:
    virtual void FunTest1()
    {
        cout << "A::FunTest1()" << endl;
    }
    virtual void FunTest2()
    {
        cout << "A::FunTest2()" << endl;
    }
private:
    int _a;
};
class B1 :virtual public A
{
public:
    virtual void FunTest3()
    {
        cout << "B1::FunTest3()" << endl;
    }
    virtual void FunTest4()
    {
        cout << "B2::FunTest4()" << endl;
    }
private:
    int _b1;
};
class B2 :virtual public A
{
public:
    virtual void FunTest1()
    {
        cout << "B2::FunTest1()" << endl;
    }
    virtual void FunTest4()
    {
        cout << "B2::FunTest4()" << endl;
    }
private:
    int _b2;
};
class C :public B1, public B2
{
public:
    virtual void FunTest1()
    {
        cout << "C::FunTest1()" << endl;
    }
    virtual void FunTest5()
    {
        cout << "C::FunTest5()" << endl;
    }
private:
    int _c;
};

void Test1()
{
    C c;
    c.FunTest5();
}

淺析C++多態(tài)及其實(shí)現(xiàn)模式

     可見,在虛擬繼承中,無論是幾重繼承,最終子類的虛函數(shù)表總是與繼承列表的第一個(gè)父類的虛函數(shù)表合并在一起,但是有覆蓋的虛函數(shù),自然去覆蓋父類的同名虛函數(shù),并合并在該父類的虛表中。

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。

網(wǎng)頁名稱:淺析C++多態(tài)及其實(shí)現(xiàn)模式-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://jinyejixie.com/article30/dpedpo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)動(dòng)態(tài)網(wǎng)站、網(wǎng)站策劃、軟件開發(fā)微信公眾號(hào)、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司
邯郸县| 赤城县| 昌江| 麟游县| 新泰市| 会泽县| 吴堡县| 蓝田县| 双柏县| 夹江县| 厦门市| 泰州市| 于田县| 罗定市| 洞头县| 社会| 牟定县| 长岛县| 航空| 萍乡市| 永德县| 兴安盟| 偃师市| 礼泉县| 尚志市| 肇庆市| 乡城县| 罗甸县| 合阳县| 安平县| 锡林郭勒盟| 元谋县| 镇巴县| 古蔺县| 阳朔县| 寿宁县| 临泉县| 永嘉县| 容城县| 正安县| 台安县|