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

C++淺析虛函數(shù)使用方法

 更新時間:2022年08月24日 16:20:14   作者:_拾貳_  
對C++了解的人都應(yīng)該知道虛函數(shù)(Virtual Function)是通過一張?zhí)摵瘮?shù)表(Virtual Table)來實(shí)現(xiàn)的。簡稱為V-Table。本文就將詳細(xì)講講虛函數(shù)表的原理與使用,需要的可以參考一下

闡述虛函數(shù)作用和原理、純虛函數(shù)和虛函數(shù)的區(qū)別。

一、虛函數(shù)

首先來看下面這一段代碼,首先創(chuàng)建兩個類,一個是Dog,另一個是Cat,他們有一個共同的屬性:Run。在定義中每個動物都需要創(chuàng)建一個類,比較繁瑣,所以在下面的例子中,我們可以把他們簡化。

#include <iostream>
using namespace std;
class Dog{
public:
    void Run(){
        cout<<"Dog->Run"<<endl;
    }    
};
class Cat{
public:
    void Run(){
        cout<<"Cat->Run"<<endl;
    }
};
int main()
{
    Dog d;
    d.Run();
    Cat c;
    c.Run();
    return 0;
}

這里使用多態(tài)和虛函數(shù),而Animal提供統(tǒng)一的接口,供子類使用,雖然代碼繁瑣,但提高了整個工程的可擴(kuò)展性和靈活性。

在普通函數(shù)前加上關(guān)鍵字 virtual 構(gòu)成虛函數(shù),子類需要重寫父類的虛函數(shù),這樣在調(diào)用的時候,會覆蓋掉父類的虛函數(shù) Run,去執(zhí)行子類的Run。

#include <iostream>
using namespace std;
class Animal{
public:
    virtual void Run(){
        cout<<"Animal->Run"<<endl;
    }
};
class Dog :public Animal{
public:
    void Run(){
        cout<<"Dog->Run"<<endl;
    }    
};
class Cat:public Animal{
public:
    void Run(){
        cout<<"Cat->Run"<<endl;
    }
};
int main()
{
    Animal *ani;
    ani = new Dog;
    ani->Run();
    delete ani;
    ani = new Cat;
    ani->Run();
    delete ani;
    return 0;
}

結(jié)果如下:

所以在這里只需要修改ani的指向就可以實(shí)現(xiàn)不同方法。如果不存在虛函數(shù),把Animal類的關(guān)鍵詞virtual去掉會怎么樣呢,顯然,他們會默認(rèn)實(shí)現(xiàn)父類Run的方法。

class Animal{
public:
    void Run(){
        cout<<"Animal->Run"<<endl;
    }
};

所以引入虛函數(shù)是為了實(shí)現(xiàn)動態(tài)多態(tài),指向不同的子類來實(shí)現(xiàn)不同的方法。

二、虛函數(shù)與純虛函數(shù)的區(qū)別

因?yàn)楦割惖暮瘮?shù)可以不做任何操作,所以這里可以直接等于0;實(shí)現(xiàn)純虛函數(shù)。

//虛函數(shù)
class Animal{
public:
    virtual void Run(){
        cout<<"Animal->Run"<<endl;
    }
};
//純虛函數(shù)
class Animal{
public:
    virtual void Run()=0;
};

虛函數(shù)與純虛函數(shù)的區(qū)別:

純虛函數(shù)只是一個接口,只能供子類去重寫實(shí)現(xiàn)方法。而虛函數(shù)在里面也可以去實(shí)現(xiàn)父類的功能。只需要指向父類的方法即可。

總結(jié):虛函數(shù)在子類里面也可以不進(jìn)行重寫,但純虛函數(shù)必須在子類去實(shí)現(xiàn),如果把子類中的Run方法去掉,只留下父類中的純虛函數(shù),那么編譯器會報錯,這里大家可以試試。

三、動態(tài)多態(tài)

Animal內(nèi)部的結(jié)構(gòu)是什么樣呢?這里有一個虛函數(shù)指針(vfptr)和虛函數(shù)表(vftable)。 指針(vfptr)指向虛函數(shù)表,在虛函數(shù)表(vftable)內(nèi)記錄著虛函數(shù)的地址,即Run函數(shù)的地址。

當(dāng)子類的Dog去繼承父類后,父類的虛函數(shù)表相應(yīng)的也繼承下來,子類也會保存一份和父類相同的。

注意!這時候如果發(fā)生重寫,即子類重寫了父類的虛函數(shù),則子類的虛函數(shù)表會覆蓋父類繼承下來的虛函數(shù)表。但父類的虛函數(shù)表不會發(fā)生改變。

當(dāng)父類的指針或者引用指向子類的對象時,就發(fā)生了多態(tài)。

下面的代碼中是指向了Dog,所以會去Dog的虛函數(shù)表中找到相應(yīng)的函數(shù),在運(yùn)行階段發(fā)生了動態(tài)多態(tài)。

    Animal *ani;
    ani = new Dog;
    ani->Run();

到此這篇關(guān)于C++淺析虛函數(shù)使用方法的文章就介紹到這了,更多相關(guān)C++虛函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • QT實(shí)現(xiàn)提示右下角冒泡效果

    QT實(shí)現(xiàn)提示右下角冒泡效果

    這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)提示右下角冒泡效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 使用C語言繪制柱形圖的示例代碼

    使用C語言繪制柱形圖的示例代碼

    常用的統(tǒng)計圖有條形圖、柱形圖、折線圖、曲線圖、餅圖、環(huán)形圖、扇形圖,這篇文章主要為大家介紹了C語言中繪制條形圖和柱形圖的方法,需要的可以參考下
    2024-02-02
  • C++動態(tài)規(guī)劃之背包問題解決方法

    C++動態(tài)規(guī)劃之背包問題解決方法

    這篇文章主要介紹了C++動態(tài)規(guī)劃之背包問題解決方法,實(shí)例分析了背包問題的原理與C++實(shí)現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • C++ 中的new 和 delete 運(yùn)算符及new和malloc的區(qū)別解析

    C++ 中的new 和 delete 運(yùn)算符及new和malloc的區(qū)別解析

    在C++中,又引出了一個新玩法:new 和 delete,在C++中,new是用來動態(tài)開辟內(nèi)存的,delete是用來釋放我們所動態(tài)開辟的內(nèi)存C++中的new和delete運(yùn)算符及new和malloc的區(qū)別解析,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • C語言二維數(shù)組運(yùn)用實(shí)現(xiàn)掃雷游戲

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

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

    C++簡單實(shí)現(xiàn)Dijkstra算法

    這篇文章主要為大家詳細(xì)介紹了C++簡單實(shí)現(xiàn)Dijkstra算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C++之Boost::array用法簡介

    C++之Boost::array用法簡介

    這篇文章主要介紹了C++之Boost::array用法簡介,較為詳細(xì)的分析了Boost::array中的常見用法,并用實(shí)例的形式予以總結(jié)歸納,需要的朋友可以參考下
    2014-10-10
  • C語言數(shù)據(jù)結(jié)構(gòu)不掛科指南之線性表詳解

    C語言數(shù)據(jù)結(jié)構(gòu)不掛科指南之線性表詳解

    線性表是由?n(n≥0)個數(shù)據(jù)元素組成的有窮序列,這篇文章主要來和大家來了C語言數(shù)據(jù)結(jié)構(gòu)中的線性表,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-09-09
  • C++函數(shù)指針的用法詳解

    C++函數(shù)指針的用法詳解

    這篇文章主要為大家介紹了C++函數(shù)指針的用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

    2022-01-01
  • c++類的隱式轉(zhuǎn)換與強(qiáng)制轉(zhuǎn)換重載詳解

    c++類的隱式轉(zhuǎn)換與強(qiáng)制轉(zhuǎn)換重載詳解

    轉(zhuǎn)換函數(shù)的名稱是類型轉(zhuǎn)換的目標(biāo)類型,因此,不必再為它指定返回值類型;轉(zhuǎn)換函數(shù)是被用于本類型的數(shù)值或變量轉(zhuǎn)換為其他的類型,也不必帶參數(shù)
    2013-09-09

最新評論

河西区| 进贤县| 福州市| 高尔夫| 保定市| 舞钢市| 稷山县| 宣城市| 闻喜县| 东丰县| 莱州市| 南溪县| 北京市| 镇雄县| 鄯善县| 福海县| 平罗县| 太保市| 裕民县| 信宜市| 泸定县| 汪清县| 根河市| 清新县| 恩施市| 乐安县| 扬中市| 邯郸县| 滨州市| 盱眙县| 井研县| 日照市| 上虞市| 保靖县| 台州市| 桃江县| 宣城市| 东方市| 当涂县| 西充县| 同德县|