欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

2.1 單類繼承

定義一個(gè)父類

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

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

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

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

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

  • 當(dāng)我們把子類中的虛函數(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ù)的位置上。

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

2.2 多類繼承

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

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

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

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

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

父類的虛函數(shù)被子類覆蓋后,則父類指針指向該子類對(duì)象時(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 沒(méi)有成員函數(shù)f()
                  // 多態(tài)首先得是 父類有虛函數(shù),其次是子類要定義該函數(shù)的重載
                  // 如果父類的虛函數(shù)改為成員函數(shù),則子類無(wú)法進(jìn)行重載,即無(wú)法實(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é)

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

相關(guān)文章

  • C語(yǔ)言驅(qū)動(dòng)開發(fā)之通過(guò)ReadFile與內(nèi)核層通信

    C語(yǔ)言驅(qū)動(dòng)開發(fā)之通過(guò)ReadFile與內(nèi)核層通信

    驅(qū)動(dòng)與應(yīng)用程序的通信是非常有必要的,內(nèi)核中執(zhí)行代碼后需要將其動(dòng)態(tài)顯示給應(yīng)用層。為了實(shí)現(xiàn)內(nèi)核與應(yīng)用層數(shù)據(jù)交互則必須有通信的方法,微軟為我們提供了三種通信方式,本文先來(lái)介紹通過(guò)ReadFile系列函數(shù)實(shí)現(xiàn)的通信模式
    2022-09-09
  • VisualStudio2022制作多項(xiàng)目模板及Vsix插件的實(shí)現(xiàn)

    VisualStudio2022制作多項(xiàng)目模板及Vsix插件的實(shí)現(xiàn)

    本文主要介紹了VisualStudio2022制作多項(xiàng)目模板及Vsix插件的實(shí)現(xiàn),文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • 解讀C++11 原生字符串

    解讀C++11 原生字符串

    這篇文章主要介紹了C++11 原生字符串的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++11,感興趣的朋友可以了解下
    2020-08-08
  • C++歸并法+快速排序?qū)崿F(xiàn)鏈表排序的方法

    C++歸并法+快速排序?qū)崿F(xiàn)鏈表排序的方法

    這篇文章主要介紹了C++歸并法+快速排序?qū)崿F(xiàn)鏈表排序的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • C++課程設(shè)計(jì)之圖書館管理系統(tǒng)

    C++課程設(shè)計(jì)之圖書館管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++課程設(shè)計(jì)之圖書館管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲的示例代碼

    C語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲的示例代碼

    猜數(shù)字小游戲是我們小時(shí)候喜歡我們一個(gè)經(jīng)典小游戲。這篇文章將利用C語(yǔ)言中的循環(huán)語(yǔ)句、分支語(yǔ)句和函數(shù)實(shí)現(xiàn)這一游戲,需要的可以參考一下
    2022-10-10
  • C語(yǔ)言中((type *)0) 和(type *0)區(qū)別小結(jié)

    C語(yǔ)言中((type *)0) 和(type *0)區(qū)別小結(jié)

    ((type *)0)?和?(type *0)?在 C 和 C++ 中有不同的含義和用途,本文主要介紹了C語(yǔ)言中((type *)0) 和(type *0)區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08
  • C語(yǔ)言二維數(shù)組運(yùn)用實(shí)現(xiàn)掃雷游戲

    C語(yǔ)言二維數(shù)組運(yùn)用實(shí)現(xiàn)掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言二維數(shù)組運(yùn)用實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++對(duì)數(shù)組的引用實(shí)例分析

    C++對(duì)數(shù)組的引用實(shí)例分析

    這篇文章主要介紹了C++對(duì)數(shù)組的引用實(shí)例分析,需要的朋友可以參考下
    2014-08-08
  • C語(yǔ)言關(guān)系運(yùn)算符實(shí)例詳解

    C語(yǔ)言關(guān)系運(yùn)算符實(shí)例詳解

    本文主要介紹C語(yǔ)言的關(guān)系運(yùn)算符的知識(shí),這里提供實(shí)例代碼以便參考,希望能幫助有需要的小伙伴
    2016-07-07

最新評(píng)論