關於虛函數的問題

來源:互聯網
上載者:User
   虛函數是定義在基類中的,定義為 virtual
的函數是基類期待衍生類別重新定義的,基類希望衍生類別繼承的函數不能定義為虛函數。定義虛函數的一個重點,我認為這也是虛函數存在的理由:支援動態綁定。
   關於動態綁定在C++Primer中的解釋是:運行時類型。基類類型的指標和引用可以綁定到衍生類別型的對象,在這種情況下,靜態類型是基類引用(或指標),但動態類型是衍生類別引用(或指標)。通過基類的引用或指標調用定義為virtual的函數時會發生動態綁定,比如,如果調用非虛函數,則無論實際對象是什麼類型,都執行基類類型所定義的函數。如果調用虛函數,則直到運行時才能確定調用哪個函數,啟動並執行虛函數是引用所綁定的或指標所指向的對象所屬類型定義的版本。
   我的朋友lizhaochai給了我幾個不錯的例子幫我理解,拿出來和大家分享一下。
#include<iostream>
using namespace std;
class s1
{
    int i;
    public:s1(){}
    virtual void print(){cout<<"調用的是基類的print"<<endl;}
    void f0(){ cout<<"調用的是基類的f0"<<endl;}
};
class s2:public s1
{
    int a;
    public: s2(){}
    void print(){cout<<"調用的是衍生類別的print"<<endl;}
    void f0(){ cout<<"調用的是子類的f0"<<endl;}
};
int main()
{
    s2 x;
    s1* p=&x;
    p->f0();//大家認為這個輸出的是什麼呢? 
    p->print();
    system("pause");
    return 0;
}
這其中的fO()函數,不是虛函數,所以它不支援動態綁定,所輸出的自然是P(基類類型)所定義的函數。當然如果要用基類的指標訪問定義於衍生類別中的成員函數時,必須對指標進行類型轉換,將指標顯示轉換為衍生類別指標類型,如:((s2*)p)->print();
如果用衍生類別的指標訪問基類的成員函數時,同上。
    這隻是我的一個小小總結,希望大家多指點。有不好的地方請指出。如果好的話,我可以給分。謝謝。
  
  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.