派生類對基類成員的訪問許可權和派生類物件對基類成員的訪問許可權
派生類在類內只可能訪問基類的public和protected成員
派生類物件和基類物件只能訪問自個類的public成員
基類成員在繼承後在派生類中的許可權:
基類許可權: public private protected
繼承許可權:public 繼承 public private protected
private繼承 private private private
protected繼承 protected private protected
繼承訪問許可權三看原則:
①看在類的內部還是外部訪問類成員
②看子類的繼承許可權(public private protected)
③看基類的許可權(public private protected)
以下是測試驗證:
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 }
派生類在類內只可能訪問基類的public和protected成員
派生類物件和基類物件只能訪問自個類的public成員
基類成員在繼承後在派生類中的許可權:
基類許可權: public private protected
繼承許可權:public 繼承 public private protected
private繼承 private private private
protected繼承 protected private protected
繼承訪問許可權三看原則:
①看在類的內部還是外部訪問類成員
②看子類的繼承許可權(public private protected)
③看基類的許可權(public private protected)