溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++中虛函數(shù)與純虛函數(shù)的區(qū)別有哪些

發(fā)布時(shí)間:2021-08-11 14:47:54 來源:億速云 閱讀:243 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下C++中虛函數(shù)與純虛函數(shù)的區(qū)別有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

    什么是虛函數(shù):

    虛函數(shù) 是在基類中使用關(guān)鍵字 virtual 聲明的函數(shù),在C++ 語言中虛函數(shù)可以繼承,當(dāng)一個(gè)成員函數(shù)被聲明為虛函數(shù)之后,其派生類中的同名函數(shù)都自動(dòng)生成為虛函數(shù),

    虛函數(shù)主要體驗(yàn)C++的多態(tài)方面,(多態(tài)是參數(shù)個(gè)數(shù)和類型相同而實(shí)現(xiàn)功能不同的函數(shù))

    為了更好的里面虛函數(shù)請(qǐng)看下面的demo

    #include <iostream>
    #include <string>
    using namespace std;
     
    class Aname
    {
    public:
         virtual void function_name()
         {
              cout << "Aname調(diào)用了function_name" << endl;
         }
    };
     
    class Bname:public Aname
    {
    public:
         void function_name()
         {
              cout << "Bname調(diào)用了function_name" << endl;
         }
    };
     
    int main()
    {
         Aname *a = new Bname();
         a->function_name();
         
    }

    這里由于類Aname 里面的function_name 被聲明為虛函數(shù), 所以雖然指針a 指向Aname 卻調(diào)用了

    Bname 里面的function_name

    打印結(jié)果為

    C++中虛函數(shù)與純虛函數(shù)的區(qū)別有哪些

    如果類Aname 里面的函數(shù)沒有聲明虛函數(shù), 是調(diào)用A里面的函數(shù)的,

    虛函數(shù)的注意事項(xiàng):

    1 只有類的成員函數(shù)才能為虛函數(shù)

    2 靜態(tài)成員函數(shù)不能為虛函數(shù),內(nèi)聯(lián)函數(shù)和構(gòu)造函數(shù)不能為虛函數(shù)

    純虛函數(shù)

    是指被表明為不被具體實(shí)現(xiàn)的虛成員函數(shù),它不具備函數(shù)的功能,它在基類中沒有定義,但要求任何派生類都要定義自己的實(shí)現(xiàn)方法。在基類中實(shí)現(xiàn)純虛函數(shù)的方法是在函數(shù)原型后加"=0"

    例如:

    virtual void funtion1()=0

    demo 認(rèn)識(shí)下純虛函數(shù)

    #include <iostream>
    #include <string>
    using namespace std;
     
    class Aname
    {
    public:
         virtual void function_name() = 0;
    };
     
    class Bname : public Aname
    {
    public:
         void function_name()
         {
              cout << "Bname調(diào)用了function_name" << endl;
         }
    };
     
    int main()
    {
         Aname *a = new Bname();
         a->function_name();
    }

    純虛函數(shù)的注意事項(xiàng):

    1 純虛函數(shù)不能被實(shí)例化

    2 virtual void function_name() = 0; 中 viertual 不能去掉,否則會(huì)報(bào)錯(cuò)

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

    1. 虛函數(shù)和純虛函數(shù)可以定義在同一個(gè)類(class)中,含有純虛函數(shù)的類被稱為抽象類(abstract class),而只含有虛函數(shù)的類(class)不能被稱為抽象類(abstract class)。

    2. 虛函數(shù)可以被直接使用,也可以被子類(sub class)重載以后以多態(tài)的形式調(diào)用,而純虛函數(shù)必須在子類(sub class)中實(shí)現(xiàn)該函數(shù)才可以使用,因?yàn)榧兲摵瘮?shù)在基類(base class)只有聲明而沒有定義。

    3. 虛函數(shù)和純虛函數(shù)都可以在子類(sub class)中被重載,以多態(tài)的形式被調(diào)用。 

    4. 虛函數(shù)和純虛函數(shù)通常存在于抽象基類(abstract base class -ABC)之中,被繼承的子類重載,目的是提供一個(gè)統(tǒng)一的接口。

    5. 虛函數(shù)的定義形式:virtual {method body}

      純虛函數(shù)的定義形式:virtual { } = 0;

    在虛函數(shù)和純虛函數(shù)的定義中不能有static標(biāo)識(shí)符,原因很簡單,被static修飾的函數(shù)在編譯時(shí)候要求前期bind,然而虛函數(shù)卻是動(dòng)態(tài)綁定(run-time bind),而且被兩者修飾的函數(shù)生命周期(life recycle)也不一樣。 

    6. 虛函數(shù)必須實(shí)現(xiàn),如果不實(shí)現(xiàn),編譯器將報(bào)錯(cuò),錯(cuò)誤提示為:

    error LNK****: unresolved external symbol "public: virtual void __thiscall
    ClassName::virtualFunctionName(void)"

    7. 對(duì)于虛函數(shù)來說,父類和子類都有各自的版本。由多態(tài)方式調(diào)用的時(shí)候動(dòng)態(tài)綁定。 

    8. 實(shí)現(xiàn)了純虛函數(shù)的子類,該純虛函數(shù)在子類中就編程了虛函數(shù),子類的子類即孫子類可以覆蓋

    該虛函數(shù),由多態(tài)方式調(diào)用的時(shí)候動(dòng)態(tài)綁定。

    9. 虛函數(shù)是C++中用于實(shí)現(xiàn)多態(tài)(polymorphism)的機(jī)制。核心理念就是通過基類訪問派生類定義的

    函數(shù)

    10. 多態(tài)性指相同對(duì)象收到不同消息或不同對(duì)象收到相同消息時(shí)產(chǎn)生不同的實(shí)現(xiàn)動(dòng)作。C++支持兩種多態(tài)性:編譯時(shí)多態(tài)性,運(yùn)行時(shí)多態(tài)性。
    a.編譯時(shí)多態(tài)性:通過重載函數(shù)實(shí)現(xiàn)
    b 運(yùn)行時(shí)多態(tài)性:通過虛函數(shù)實(shí)現(xiàn)。

    11. 如果一個(gè)類中含有純虛函數(shù),那么任何試圖對(duì)該類進(jìn)行實(shí)例化的語句都將導(dǎo)致錯(cuò)誤的產(chǎn)生,因?yàn)槌橄蠡?ABC)是不能被直接調(diào)用的。必須被子類繼承重載以后,根據(jù)要求調(diào)用其子類的方法。

    以上是“C++中虛函數(shù)與純虛函數(shù)的區(qū)別有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI