繼承
通過繼承,可以利用已有的類來定義新的類。所定義的新的類不僅擁有新定義的成員,而且還同時擁有舊的成員。我們稱已存在的用來派生新類的類為基類,又稱為父類。由已存在的類派生出的新類稱為派生類,又稱為子類。
?例1
class Base{? }
class Derived : public Base {??? }
冒號指出Derived類的基類是Base類。例中表明Base類是公有基類,這被稱為公有派生。使用公有派生,基類的公有成員將成為派生類的公有成員,基類的私有部分也將成為派生類的一部分,但只能通過基類的公有和保護方法訪問。
繼承關系下的構造與析構
創(chuàng)建派生類對象時,程序首先調用基類構造函數(shù),再調用派生類構造函數(shù)。基類構造函數(shù)負責初始化繼承的數(shù)據(jù)成員;派生類構造函數(shù)主要用于初始化新增的數(shù)據(jù)成員。派生類的構造函數(shù)總是調用一個基類構造函數(shù),可以使用初始化器列表語法指明要使用的基類構造函數(shù),否則將使用默認的基類構造函數(shù)。
派生類對象過期時,程序將首先調用派生類析構函數(shù),再調用基類析構函數(shù)。
需要注意一點,基類應包含一個虛析構函數(shù),即使有時并不需要析構函數(shù)。如果析構函數(shù)不是虛的,則將只調用對應于指針類型的析構函數(shù)。例如
...
Base * p = new Derived(...);
delete p;
...
這意味著只有Base的析構函數(shù)被調用,即使指針指向的是一個Derived對象。如果析構函數(shù)是虛的,將調用相應對象類型的析構函數(shù)。因此基類使用虛析構函數(shù)可以確保正確的析構函數(shù)序列被調用。
虛函數(shù)(virtual functions)
有時我們希望同一個方法在基類和派生類中的行為是不同的的,這時我們可以將基類方法聲明為虛的,然后在派生類中重新定義基類的方法。這樣,程序將根據(jù)對象類型而不是引用或指針的類型來選擇方法版本。
non-virtual函數(shù):你不希望子類重新定義它。
virtual函數(shù):你希望子類重新定義它,且它已有默認定義。
pure virtual函數(shù):你希望子類一定要重新定義它,你對它沒有默認定義。