1. 程式人生 > 實用技巧 >執行時多型的最終奧義:虛擬函式的妙用

執行時多型的最終奧義:虛擬函式的妙用

為了方便理解,先做如下比喻:

我要寫這麼個函式:建立個“爺爺”,“爸爸”,“我”三個型別,分別定義各自一個物件,三個物件過載到一個“輸出年齡”函式上,輸出各自的年齡。

先放個錯誤輸出程式碼:

#include<iostream>
using namespace std;
class Yeye
{
public:
    void nianling()const
    {
        cout << "爺爺年齡80" << endl;
    }
};
class Baba :public Yeye { public: void nianling() const { cout << "爸爸年齡53" << endl; } }; class Wo:public Baba { public: void nianling() const { cout << "我的年齡26" << endl; } }; void shuchunianling(Yeye* ptr) { ptr->nianling(); } int
main() { Yeye yeye; Baba baba; Wo wo; shuchunianling(&yeye); shuchunianling(&baba); shuchunianling(&wo); return 0; }

得到輸出如下:

這就奇怪了,我在輸出年齡函式裡明明傳入的是爺爺物件地址,爸爸物件地址,我物件地址,為什麼輸出還只是爺爺的年齡呢?

那麼接下來,在爺爺這個類中,加入一個 virtual關鍵字,問題就解決了。如下圖處,加一個virtual關鍵字。

最終程式碼如下:

#include<iostream>
using
namespace std; class Yeye { public: virtual void nianling()const { cout << "爺爺年齡80" << endl; } }; class Baba :public Yeye { public: void nianling() const { cout << "爸爸年齡53" << endl; } }; class Wo:public Baba { public: void nianling() const { cout << "我的年齡26" << endl; } }; void shuchunianling(Yeye* ptr) { ptr->nianling(); } int main() { Yeye yeye; Baba baba; Wo wo; shuchunianling(&yeye); shuchunianling(&baba); shuchunianling(&wo); return 0; }

最終輸出如下:

virtual關鍵字,告訴編譯器,凡是對虛擬函式的呼叫,不要立即決定呼叫某個函式體,而是在執行的時候再做決定。

我的個人看法是:每換一個派生類,派生類相關的虛基類指標偏移量便不同,這樣便得以實現了虛擬函式呼叫了不同的函式體,從而形成了執行時的多型。

個人看法有可能不準確,還請路過大佬多多指點。