c++派生類的訪問控制權限


派生類必須通過使用類派生列表, 明確指出它是從哪個(哪些)基類繼承而來的。類派生列表的形式是:首先是一個冒號,后面緊跟以逗號分隔的基類列表(可以多繼承,但一般不使用多繼承),其中每個基類前面可以有以下三種訪問說明符中的一個: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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM