最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于虛函數(shù)實現(xiàn)多態(tài)的原理及分析

 更新時間:2023年02月05日 16:37:38   作者:Cynantrs  
這篇文章主要介紹了C++中如何實現(xiàn)多態(tài)問題,具有很好的參考價值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

1、C++中如何實現(xiàn)多態(tài)

  • 基類中先聲明一個虛函數(shù)
  • 至少有一個繼承該基類的子類

2、虛函數(shù)實現(xiàn)多態(tài)的原理

  • 當一個類中出現(xiàn)虛函數(shù)或著子類繼承了虛函數(shù)時,就會在該類中產(chǎn)生一個虛函數(shù)表(virtual table),虛函數(shù)表實際上是一個函數(shù)指針數(shù)組(在有的編譯器作用下是鏈表),里面的每一個元素對應指向該類中的某一個虛函數(shù)的指針。
  • 被該類聲明的對象會包含一個虛函數(shù)表指針(virtual table pointer),指向該類的虛函數(shù)表的地址。
  • 虛函數(shù)的調(diào)用過程: 當一個對象要調(diào)用到虛函數(shù)時,先將對象內(nèi)存中的vptr指針(虛函數(shù)表指針)指向定義該類的vtbl(虛函數(shù)表),vtbl再尋找里面的指針指向想要調(diào)用的虛函數(shù),從而完成虛函數(shù)的調(diào)用。

2.1 單類繼承

定義一個父類

class Person{
public:
	virtual void f(){cout << "use f()" << endl;}
	virtual void g(){cout << "use g()" << endl;}
	virtual void h(){cout << "use h()" << endl;}
};

父類對象其在內(nèi)存中布局如下:

  • 再定義一個子類,此時并不覆蓋父類的虛函數(shù):
class Bag:public Person{
public:
	virtual void i(){cout << "use i()" << endl;}
	virtual void j(){cout << "use j()" << endl;}
};

可以看出虛函數(shù)表內(nèi)的虛函數(shù)是按聲明順序進行排序的

父類虛函數(shù)排在子類虛函數(shù)之前

  • 當我們把子類中的虛函數(shù)覆蓋掉:(修改Bag類)
class Bag:public Person{
public:
	void f(){cout << "class Bag use fun" << endl;}
	virtual void i(){cout << "use i()" << endl;}
	virtual void j(){cout << "use j()" << endl;}
}; 

子類覆蓋的虛函數(shù),放在父類原先放該虛函數(shù)的位置上。

所以當父類指針指向該子類對象時,會調(diào)用該子類的重載函數(shù)

2.2 多類繼承

  • 子類沒有覆蓋父類的虛函數(shù)

子類的虛函數(shù)放在第一張?zhí)摵瘮?shù)表中,緊跟著第一個父類的虛函數(shù)

如果每個父類都有虛函數(shù),則有幾個父類就有幾張?zhí)摵瘮?shù)表

  • 子類覆蓋父類的虛函數(shù)

父類的虛函數(shù)被子類覆蓋后,則該子類對應的重載函數(shù)的位置在被覆蓋的父類函數(shù)的位置上。(如果父類沒有該虛函數(shù),則不用被覆蓋)

父類的虛函數(shù)被子類覆蓋后,則父類指針指向該子類對象時,調(diào)用的f()便是子類中重載的f()

示例

#include <iostream>
using namespace std;

class Person1{
public:
    virtual void f(){}
    virtual void g(){}
    virtual void h(){}
    virtual ~Person1(){}
};

class Person2{
public:
    virtual void f(){}
    virtual void g(){}
    virtual void h(){}
    void a(){           // 成員函數(shù),不需要重載
        cout << "class Person2" << endl;
    }
    virtual ~Person2(){}
};

class Person3{
public:
    virtual void g(){}
    virtual void h(){}
    virtual ~Person3(){}
};

class Bag:public Person1, public Person2, public Person3{
public:
    void f(){
        cout << "Bag f()" << endl;
    }
    void g(){
        cout << "Bag g()" << endl;
    }
    void a(){
        cout << "Class Bag" << endl;
    }
};

int main(int argc, char const *argv[])
{
    Person3* p3 = new Bag;
    //p3->f();    // P3 沒有成員函數(shù)f()
                  // 多態(tài)首先得是 父類有虛函數(shù),其次是子類要定義該函數(shù)的重載
                  // 如果父類的虛函數(shù)改為成員函數(shù),則子類無法進行重載,即無法實現(xiàn)多態(tài)
    delete p3;
    p3 = NULL;

    Person1* p1 = new Bag;
    p1->f();
    delete p1;
    p1 = NULL;

    Person2* p2 = new Bag;
    p2->a();
    delete p2;
    p2 = NULL;
    
    return 0;
}

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • VS2022新建項目時沒有ASP.NET Web應用程序(.NET Framework)

    VS2022新建項目時沒有ASP.NET Web應用程序(.NET Framework)

    本文主要介紹了VS2022新建項目時沒有ASP.NET Web應用程序的解決,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-10-10
  • 在vs2010中,輸出當前文件路徑與源文件當前行號的解決方法

    在vs2010中,輸出當前文件路徑與源文件當前行號的解決方法

    本篇文章是對在vs2010中,輸出當前文件路徑與源文件當前行號的解決方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C及C++?基礎循環(huán)示例詳解

    C及C++?基礎循環(huán)示例詳解

    這篇文章主要介紹了C及C++?中的循環(huán)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • C++深淺拷貝和string類的兩種寫法詳解

    C++深淺拷貝和string類的兩種寫法詳解

    這篇文章主要為大家詳細介紹了C++深淺拷貝和string類的兩種寫法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++中函數(shù)模板的用法詳細解析

    C++中函數(shù)模板的用法詳細解析

    所謂函數(shù)模板實際上是建立一個通用函數(shù),其涵涵素類型額形參類型不具體指定,用一個虛擬的類型來代表,這個通用函數(shù)就稱為函數(shù)模板
    2013-10-10
  • C語言版三子棋游戲

    C語言版三子棋游戲

    這篇文章主要為大家詳細介紹了C語言版三子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • OpenMP task construct 實現(xiàn)原理及源碼示例解析

    OpenMP task construct 實現(xiàn)原理及源碼示例解析

    這篇文章主要為大家介紹了OpenMP task construct 實現(xiàn)原理及源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • VC判斷進程是否具有administrator權(quán)限的方法

    VC判斷進程是否具有administrator權(quán)限的方法

    這篇文章主要介紹了VC判斷進程是否具有administrator權(quán)限的方法,在Windows應用程序設計中具有一定的實用價值,需要的朋友可以參考下
    2014-10-10
  • C++ GDI實現(xiàn)圖片格式轉(zhuǎn)換

    C++ GDI實現(xiàn)圖片格式轉(zhuǎn)換

    GDI+(Graphics Device Interface Plus)是一種用于圖形繪制和圖像處理的應用程序編程接口(API),在Windows平臺上廣泛使用,本文就來介紹一下如何使用GDI實現(xiàn)圖片格式轉(zhuǎn)換吧
    2023-12-12
  • 利用Qt繪制雷達掃描效果

    利用Qt繪制雷達掃描效果

    這篇文章主要為大家詳細介紹了如何利用Qt繪制簡單的雷達掃描效果,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下
    2023-04-04

最新評論

永平县| 邳州市| 绍兴市| 噶尔县| 云和县| 枝江市| 建水县| 宣武区| 上栗县| 威海市| 阆中市| 沭阳县| 桦甸市| 利川市| 孟津县| 乐安县| 西平县| 兰考县| 峨边| 兰坪| 渑池县| 柳州市| 白玉县| 海口市| 宁乡县| 巩留县| 施秉县| 吴川市| 瑞昌市| 牟定县| 出国| 建宁县| 溧阳市| 徐闻县| 额尔古纳市| 台中市| 灵寿县| 仪陇县| 怀远县| 板桥市| 平陆县|