c++虛函數

1.虛函數ide

  [1]使用基類的指針和引用指向派生類對象時,調用的虛函數是動態綁定的,該綁定基類的函數仍是派生類的函數是根據指向對象的真實類型決定的。這個要注意的就是基類的指針或引用,若是是非指針非引用,則就是靜態綁定。例如某個函數返回的基類指針根據運行時輸入參數不一樣返回各類派生類對象,而後再用這個基類指針調用函數,就須要動態綁定。函數

  [2]基類中的虛函數,在派生類中默認也是虛函數,這意思就是派生類中覆蓋基類虛函數時,默認是加了virtual關鍵字的。spa

  [3]當派生類中覆蓋了某個虛函數時,形參必須同樣,可是不同也是能夠編譯過的,編譯器會當成兩個獨立的函數對待,可是這樣容易發生錯誤。因此能夠用override關鍵字進行顯示覆蓋,例子以下:指針

class a{
    int aa;
    virtual void fun1();
    virtual void fun2();
    void fun3();
    virtual void fun4() final;
};

class b : public a
{
    void fun1() override;           //正確
    void fun2(int) override;        //錯誤,參數不相同
    void fun3(int) override;        //錯誤,fun3不是虛函數,不能用override關鍵字

    void fun4();                    //錯誤,final虛函數不能再覆蓋了
};

  [4]總結:虛函數的目的就是實現多態(多態就是一個接口能夠調用多個方法),基類指針能夠指向各類派生類或基類的對象,而且動態調用對象的虛函數。具體作法就是聲明基類的指針,而後讓該指針指向任意一個派生類對象,調用相應的虛函數,能夠根據指向的子類的不一樣而實現不一樣的方法。若是沒有使用虛函數的話(即沒有利用C++多態性),則利用基類指針調用相應的函數的時候,將總被限制在調用基類函數自己,而沒法調用到派生類中被覆蓋過的函數。code

2.虛函數和普通函數的區別對象

  [1]使用基類的指針和引用指向派生類對象時,調用的虛函數是動態綁定的,調用的非虛函數是靜態綁定的(靜態綁定是在編譯器,動態綁定是在運行期)。 blog

  [2]因爲虛函數在運行時才肯定,因此必須爲基類中全部的虛函數提供實現(注意是基類),而普通函數在不使用的狀況下就不用實現。接口

3.虛函數和純虛函數的區別編譯器

  [1]含有虛函數的類被稱爲抽象類,抽象類不能建立對象。編譯

  [2]純虛函數在基類中只有聲明,可是不能在類內實現,能夠在類外面實現,而且純虛函數必須在派生類中實現。通常純虛函數是不在基類中實現的,固然實現了也能夠經過[基類::虛函數()]的方式去調用基類的純虛函數。

  [3]總結:純虛函數其實就是接口,意思就是隻聲明好(能夠在類外實現),讓派生類必須去實現這個接口。

相關文章
相關標籤/搜索