91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++虛函數怎么使用

發布時間:2022-08-25 10:01:50 來源:億速云 閱讀:141 作者:iii 欄目:開發技術

本篇內容介紹了“C++虛函數怎么使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

一、虛函數

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

#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;
}

C++虛函數怎么使用

這里使用多態和虛函數,而Animal提供統一的接口,供子類使用,雖然代碼繁瑣,但提高了整個工程的可擴展性和靈活性。

在普通函數前加上關鍵字 virtual 構成虛函數,子類需要重寫父類的虛函數,這樣在調用的時候,會覆蓋掉父類的虛函數 Run,去執行子類的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;
}

結果如下:

C++虛函數怎么使用

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

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

C++虛函數怎么使用

所以引入虛函數是為了實現動態多態,指向不同的子類來實現不同的方法。

二、虛函數與純虛函數的區別

因為父類的函數可以不做任何操作,所以這里可以直接等于0;實現純虛函數。

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

虛函數與純虛函數的區別:

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

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

三、動態多態

Animal內部的結構是什么樣呢?這里有一個虛函數指針(vfptr)和虛函數表(vftable)。 指針(vfptr)指向虛函數表,在虛函數表(vftable)內記錄著虛函數的地址,即Run函數的地址。

C++虛函數怎么使用

當子類的Dog去繼承父類后,父類的虛函數表相應的也繼承下來,子類也會保存一份和父類相同的。

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

C++虛函數怎么使用

當父類的指針或者引用指向子類的對象時,就發生了多態。

下面的代碼中是指向了Dog,所以會去Dog的虛函數表中找到相應的函數,在運行階段發生了動態多態。

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

“C++虛函數怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

郯城县| 潮安县| 新疆| 清丰县| 噶尔县| 邹城市| 肇源县| 建阳市| 临武县| 大冶市| 陕西省| 灵武市| 宜宾市| 湖南省| 永修县| 三都| 盈江县| 华坪县| 固始县| 神池县| 石河子市| 柳州市| 久治县| 新沂市| 台江县| 怀安县| 来安县| 潮州市| 防城港市| 革吉县| 民乐县| 乌鲁木齐县| 托克逊县| 元江| 富蕴县| 遵义县| 屏山县| 双牌县| 铜陵市| 元氏县| 佛坪县|