派生類必須通過使用類派生列表, 明確指出它是從哪個(哪些)基類繼承而來的。類派生列表的形式是:首先是一個冒號,后面緊跟以逗號分隔的基類列表(可以多繼承,但一般不使用多繼承),其中每個基類前面可以有以下三種訪問說明符中的一個:public,private,protectedd。
c++語言中,基類必須將它的兩種成員函數區分開來:一種是基類希望其派生類進行覆蓋的函數,另一種是基類希望派生類直接繼承而不要改變的函數。對於前者,基類通常將其定義為虛函數(virtual)。當我們使用指針或者引用調用虛函數時,該調用將被動態綁定。根據引用或者指針所綁定的對象類型不同,該調用可能執行基類的版本也可能執行某個派生類的版本。在某些時候基類希望它的派生類有權訪問該成員,同時禁止其他用戶訪問。我們用受保護的(protected)訪問運算符來說明這樣的成員。
基類通過在其成員函數聲明語句之前加上關鍵字virtual使得改函數執行動態綁定。任何構造函數之外的非靜態函數都可以是虛函數。關鍵字virtual只能出現在類內部聲明語句之前而不能用於類外部的函數定義。如果基類把一個函數聲明成虛函數,則該函數在派生類中隱式地也是虛函數。
之后會詳細介紹虛析構造函數,現在只用記住作為繼承關系中根節點的類(基類)通常都會定義一個虛析構造函數。即本例中的 virtual ~Parent()=default。基類通常應該定義一個虛析構造函數,即使該函數不執行任何實際操作也是如此(原因等后面隨筆的解釋——不這樣可能會導致內存泄漏,釋放子類的資源同時也要釋放父類的資源才行)。
代碼操練:
1 #include<iostream>
2 using namespace std; 3 class Parent { 4 public: 5 Parent():a(0),b(0),c(0){} 6 virtual ~Parent() = default; 7 int a; 8 protected: 9 int b; 10 private: 11 int c; 12 }; 13 //public繼承
14 class Child1 :public Parent{ 15 public: 16 void test() 17 { 18 a = 0;//√基類共有的屬性派生類可以隨意訪問
19 b = 0;//√基類受保護的屬性可以在基類類內和子類類內中訪問 20 // c = 0;//× 基類私有屬性可以繼承但不能訪問
21 } 22 protected: 23
24 private: 25 }; 26 //private繼承
27 class Child2 :private Parent { 28 public: 29 void test() 30 { 31 a = 0;//√基類共有的屬性派生類類內可以隨意訪問,就算是private繼承也可以,但是派生類外不能訪問
32 b = 0;//√基類受保護的屬性可以在基類類內和子類類內中訪問,就算是private繼承也可以,但是派生類外不能訪問 33 //c = 0;//× 基類私有屬性可以繼承但不能訪問
34 } 35 protected: 36
37 private: 38 }; 39 //protected繼承
40 class Child3 :protected Parent { 41 public: 42 void test() 43 { 44 a = 0;//√基類共有的屬性派生類類內可以隨意訪問,派生類外不能訪問
45 b = 0;//√基類受保護的屬性可以在基類類內和子類類內中訪問,派生類外不能訪問 46 //c = 0;//× 基類私有屬性可以繼承但不能訪問
47 } 48 protected: 49
50 private: 51 }; 52 int main() 53 { 54 Child1 c1; 55 c1.a = 10;//√ 56 //c1.b = 20;//× 受保護的屬性不能在類外訪問 57 //c1.c = 30;//× 基類私有屬性不可在類外訪問,哪怕你是我的子類
58
59 Child2 c2; 60 //c2.a = 10;//× private繼承基類的共有屬性也不可以在類外訪問 61 //c2.b = 20;//× 受保護的屬性不能在類外訪問 62 //c2.c = 30;//× 基類私有屬性不可在類外訪問,哪怕你是我的子類
63
64 Child3 c3; 65 //c3.a = 10;//× protected繼承基類的共有屬性也不可以在類外訪問 66 //c3.b = 20;//× 受保護的屬性不能在類外訪問 67 //c3.c = 30;//× 基類私有屬性不可在類外訪問,哪怕你是我的子類
68 cout << "hello world!\n"; 69 return 0; 70 }
summary:
一個類的pubulic屬性在類內、類外都可以訪問,
private屬性只能在這個類內訪問,
protected屬性可以在這個類內訪問也可以在這個類的派生類類內中訪問,不能在基類和派生類外部訪問。
總結表如下:
基類權限: public private protected
繼承權限:public 繼承 public private protected
private繼承 private private private
protected繼承 protected private protected
繼承訪問權限三看原則:
①:看使用的方法在類的內部還是外部
②:看子類的繼承權限(public private protected)
③:看基類的權限(public private protected)