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

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

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

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

一、虛函數(shù)

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

#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)一的接口,供子類(lèi)使用,雖然代碼繁瑣,但提高了整個(gè)工程的可擴(kuò)展性和靈活性。

在普通函數(shù)前加上關(guān)鍵字 virtual 構(gòu)成虛函數(shù),子類(lèi)需要重寫(xiě)父類(lèi)的虛函數(shù),這樣在調(diào)用的時(shí)候,會(huì)覆蓋掉父類(lèi)的虛函數(shù) Run,去執(zhí)行子類(lèi)的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類(lèi)的關(guān)鍵詞virtual去掉會(huì)怎么樣呢,顯然,他們會(huì)默認(rèn)實(shí)現(xiàn)父類(lèi)Run的方法。

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

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

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

因?yàn)楦割?lèi)的函數(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ù)只是一個(gè)接口,只能供子類(lèi)去重寫(xiě)實(shí)現(xiàn)方法。而虛函數(shù)在里面也可以去實(shí)現(xiàn)父類(lèi)的功能。只需要指向父類(lèi)的方法即可。

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

三、動(dòng)態(tài)多態(tài)

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

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

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

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

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

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

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

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)的排列組合問(wèn)題的通用算法、解決方法

    C語(yǔ)言實(shí)現(xiàn)的排列組合問(wèn)題的通用算法、解決方法

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)的排列組合問(wèn)題的通用算法、解決方法,本文使用C語(yǔ)言實(shí)現(xiàn)在程序中解決這個(gè)問(wèn)題,需要的朋友可以參考下
    2014-08-08
  • C++實(shí)現(xiàn)LeetCode(9.驗(yàn)證回文數(shù)字)

    C++實(shí)現(xiàn)LeetCode(9.驗(yàn)證回文數(shù)字)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(9.驗(yàn)證回文數(shù)字),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言文件操作實(shí)現(xiàn)數(shù)據(jù)持久化(幫你快速了解文件操作函數(shù))

    C語(yǔ)言文件操作實(shí)現(xiàn)數(shù)據(jù)持久化(幫你快速了解文件操作函數(shù))

    持久數(shù)據(jù)其實(shí)就是將數(shù)據(jù)保存到數(shù)據(jù)庫(kù),下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言文件操作實(shí)現(xiàn)數(shù)據(jù)持久化(幫你快速了解文件操作函數(shù))的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • C++ Boost Bind庫(kù)示例分析使用

    C++ Boost Bind庫(kù)示例分析使用

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)
    2022-11-11
  • C++實(shí)現(xiàn)大整數(shù)乘法(字符串乘法)

    C++實(shí)現(xiàn)大整數(shù)乘法(字符串乘法)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)大整數(shù)乘法、字符串乘法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • 如何使用C語(yǔ)言實(shí)現(xiàn)平衡二叉樹(shù)數(shù)據(jù)結(jié)構(gòu)算法

    如何使用C語(yǔ)言實(shí)現(xiàn)平衡二叉樹(shù)數(shù)據(jù)結(jié)構(gòu)算法

    對(duì)于判斷是否為平衡二叉樹(shù)而言,我們需要知道以下特性:是一個(gè)二叉樹(shù)也是一個(gè)二叉排序樹(shù)該樹(shù)的每個(gè)結(jié)點(diǎn)上的(深度)左子樹(shù) - 右子樹(shù)的值為平衡因子(BF(Balance Factor))該樹(shù)的每一個(gè)節(jié)點(diǎn)的左子樹(shù)和右子樹(shù)的高度至多等于1(平衡因子只可能是-1,0,1)
    2021-08-08
  • 教你5分鐘輕松搞定內(nèi)存字節(jié)對(duì)齊

    教你5分鐘輕松搞定內(nèi)存字節(jié)對(duì)齊

    隨便google一下,人家就可以跟你解釋的,一大堆的道理,我們沒(méi)怎么多時(shí)間,討論為何要對(duì)齊.直入主題,怎么判斷內(nèi)存對(duì)齊規(guī)則,sizeof的結(jié)果怎么來(lái)的,請(qǐng)牢記以下3條原則
    2013-09-09
  • C++類(lèi)和對(duì)象之類(lèi)的6個(gè)默認(rèn)成員函數(shù)詳解

    C++類(lèi)和對(duì)象之類(lèi)的6個(gè)默認(rèn)成員函數(shù)詳解

    類(lèi)是對(duì)某一事物的抽象描述,具體地講類(lèi)是C++中的一種構(gòu)造的數(shù)據(jù)類(lèi)型,下面這篇文章主要給大家介紹了關(guān)于C++類(lèi)和對(duì)象之類(lèi)的6個(gè)默認(rèn)成員函數(shù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • OpenCV+Qt實(shí)現(xiàn)圖像處理操作工具的示例代碼

    OpenCV+Qt實(shí)現(xiàn)圖像處理操作工具的示例代碼

    這篇文章主要介紹了利用OpenCV+Qt實(shí)現(xiàn)圖像處理操作工具,可以實(shí)現(xiàn)雪花屏、高斯模糊、中值濾波、毛玻璃等操作,感興趣的可以了解一下
    2022-08-08
  • C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)順序表詳解

    C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)順序表詳解

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)順序表的實(shí)現(xiàn)代碼的相關(guān)資料,動(dòng)態(tài)順序表在內(nèi)存中開(kāi)辟一塊空間,可以隨我們數(shù)據(jù)數(shù)量的增多來(lái)擴(kuò)容,需要的朋友可以參考下
    2021-08-08

最新評(píng)論