C++程序員應瞭解的那些事(40)子類型關係 ≠ 子類

子類型關係定義:有一個特定的類型S,當且僅當它提供類型T的行爲時,稱類型S是類型T的子類型。公有繼承方式能夠實現子類型關係,即派生類S是基類T的子類型。函數

公有繼承時,派生類的對象能夠做爲基類的對象處理,派生類是基類的子類型。spa

子類型關係使得在須要基類對象的任何地方均可以使用公有派生類的對象來替代,從而可使用相同的函數統一處理基類對象和公有派生類對象(形參爲基類對象時,實參能夠是派生類對象),大大提升了程序的效率。子類型關係是實現多態性的重要基礎之一。指針

示例:
class base
{
public:
	void print()const{cout<<"base::print()"<<endl;}
};
class derived:public base
{
public:
	void fun();
}

       派生類derived從基類base公有繼承。所以類derived是類base的一個子類型,類derived具有類base中的操做,或者說類base中的操做能夠被用於操做類derived的對象。code

注:子類型關係具備傳遞性。子類型關係能夠傳遞,可是不可逆。對象

       公有繼承能夠實現子類型關係。經過公有繼承,派生類獲得了基類中除了構造函數、析構函數以外的全部成員,並且可訪問成員的訪問控制屬性也和基類徹底相同,這樣派生類對象就能夠做爲基類的對象使用。繼承

具備子類型關係的基類和派生類的對象之間知足以下賦值兼容規則:
(1)公有派生類的對象能夠賦值給基類的對象,即用公有派生類對象中從基類繼承來的成員,逐個賦值給基類對象的成員。
例:  derived d;
      base  b;
      b=d;
(2)公有派生類的對象能夠初始化基類的引用。
例:  derived d;
      base &ref=d;
(3)公有派生類的對象的地址能夠賦值給指向基類的指針。
例:  derived d;
      base *ptr=&d;