當類之間存在多種層次結構,并且類之間通過繼承關聯時就會用到多態。
虛函數在子類中的覆蓋版本和該函數在基類中的原始版本必須有相同的函數簽名、函數名、形參名、常屬性。如果返回值為非類類型,則必須相同,如果是類類型A的指針或者引用,允許子類的覆蓋版本返回A子類的的指針或者引用。
C++多態意味著調用成員函數時會根據函數的對象的類型來執行不同的函數。
使用多態以后就可以通過基類的指針來指向不同的派生類來實現函數的多態。
使用方式為在基類需要實現多態的函數的修飾符中加入virtual
。如果沒有virtual
我們使用基類的指針只能訪問到基類的方法。
想要了解更多關于基類指針指向派生類的問題可以看我的另一篇文章:傳送門
使用virtual
修飾的函數稱為虛函數,不同于一般函數的靜態綁定,虛函數使用的時動態鏈接(后期綁定)
如果我們并不想在基類中實現虛函數(可能因為不會用到之類的原因),可以將虛函數聲明為純虛函數(接口),格式如下:
class A
{public://virtual void func(){}virtual void func() = 0;//==0告訴編譯器,函數沒有主體,這是一個純虛函數
};
包含純虛函數的類叫做抽象類,**抽象類不能被實例化,但可以定義指針。**虛函數還是需要實現的,如果不想寫可以寫成{}
當用基類指針指向派生類對象在動態分配堆上內存的時候,析構函數必須是虛函數!!!
友元函數不是成員函數,因此不能虛擬。
父類的虛函數或純虛函數在子類中仍然是虛函數,有時我們不希望父類的某個函數在子類中被重寫,在C++11后的版本可以使用final
(放在函數聲明之后,函數體之前)來避免被重寫,如果不希望一個類被繼承也可以用final
關鍵字(放在類聲明之后類體之前)