中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

C++虛函數與非虛函數的區別。

發布時間:2020-07-08 19:21:02 來源:網絡 閱讀:579 作者:yaxinsn 欄目:編程語言
#include <iostream>
#include <string>

/*
 * Animal 與Dog之間沒有虛函數
 * Animal Fish有一個eating的虛函數
 *  通過"基類的指針" 訪問 子類(們)的成員函數。這叫動態多態。是用虛函數的技術完成的。這也叫動態綁定。]
 *  當我們使用基類的引用(或指針)調用一個虛函數時將發生動態綁定(dynamic binding) 因為我們直到運行時才能知道到底調用了哪個版本的虛函數,可能是基類中的版本也可能是派生類中的版本,判斷的依據是引用(或指針)所綁 定的對象的真實類型。
 *  與非虛函數在編譯時綁定不同,虛函數是在運行時選擇函數的版本,所以動態綁定也叫運行時綁定(run-time binding)。
 *
 * 虛函數的指針會保存到class里的"虛函數表"中。每一個對象都會一個自己的“虛函數表”。類似對函數指針列表。
 *
 * */
using namespace::std;

class Animal
{
public:
        string name;
        string attr;
        Animal(string n):name(n){};
        Animal(string n,string a):name(n),attr(a){};
        void runing(int i)
        {
                cout<<"animal("<<name <<") can runing "<<i<<" meter!"<<endl;
        }
        void moving()
        {
                cout<<"animal ("<<name <<")can moving !"<<endl;
        }
        virtual void eating() //虛函數。
        {
                cout<<"animal ("<<name <<")must eat something!"<<endl;
        }

};

class DOG: public Animal
{
public:
#if 1
        using Animal::Animal; //**這個特性叫繼承構造函數** 此句表示子類可以使用Animal類里的所有構造函數,不需要程序員再手動定義一遍了,在此例中省去了如下代碼。
#else
        DOG(string t):Animal(t){};
        DOG(string t,string x):Animal(t,x){};
#endif
        void runing(float f)
        {
                cout<<"dog run fast "<<f<<" meter!" <<endl;
        }
        void moving()
        {
                cout<<"dog  move fast!"<<endl;
        }
};

class Fish: public Animal
{
public:
        using Animal::Animal;
        void eating()
        {
                cout<<"fish eat in the water"<<endl;
        }
};

/*
 * 由于moving不是虛函數,所以p->moving,使用了animal里的 moving
 * */
void test_moving(class Animal *p)
{
        p->moving();
}
/*
 * eating在基類中是一個虛函數,所以test_eating的入參是animal類型,但在程序運行過程中 “動態地”找到真正的數據類型,并調用真正的方法函數。
 * 這也是多態的一種方式。
 *
 * */
void test_eating(class Animal* p)
{
        p->eating();
}

void test_eating_moving(class Animal& p)
{
        p.eating();//是虛函數,在運行時動態來決定。
        p.moving(); //moving不是虛函數,在編譯時,決定了它是animal的moving
}
int main(void)
{
        class DOG dog("Dog bingo");
        class Animal a("Common-Animal");
        class Fish fish("Shark");
        dog.moving();
        a.moving();
        cout<<"dog is test_moving"<<endl;
        test_moving(&dog);
        dog.runing(4.4); //這里在編譯時dog.runing函數就已經是DOG類的runing函數了。
        dog.runing(9);//int 9在這里就被強制轉義成float 了。
        cout<<"fish test eating"<<endl;
        test_eating(&fish);
        fish.runing(4);//由于 Fish類里無runing函數,它在靜態編譯時使用了父類Animal的runing函數。
        cout<<"-test_eating_moving(dog)----"<<endl;
        test_eating_moving(dog);
        cout<<"-test_eating_moving(fish)----"<<endl;
        test_eating_moving(fish);

        cout <<"----------------sizeof(dog),sizeof(animal)and sizeof(fish)"<<endl;

        cout<<"dog size:"<<sizeof(dog)<<endl;
        cout<<"animal size:"<<sizeof(a)<<endl;
        cout<<"class Fish size:"<<sizeof(class Fish)<<endl;
        cout <<"size=8, this is a virtial_function_table 's size, this table has only function point. so is 8"<<endl;
        return 0;
}
向AI問一下細節

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

AI

波密县| 尉氏县| 青阳县| 长阳| 哈巴河县| 尼勒克县| 嘉禾县| 宜春市| 英吉沙县| 彰化县| 蓝山县| 天峻县| 乐至县| 临海市| 东乌珠穆沁旗| 苍山县| 叶城县| 顺义区| 阳朔县| 台北县| 南开区| 文水县| 明水县| 曲阜市| 荔波县| 乐都县| 武胜县| 安康市| 邛崃市| 南城县| 肇东市| 五家渠市| 九寨沟县| 资阳市| 五原县| 彩票| 德阳市| 龙川县| 巨鹿县| 万安县| 临泽县|