面試的時候常常會有不少概念性的東西,許久不用都會很生疏,特地整理一下方便本身之後不記得了能夠查看一下,也順便幫助本身複習一下。面試
繼承是面向對象程序設計的一個重要特性,它容許在既有類的基礎上建立新的類,新類能夠從一個或者是多個既有類中繼承函數和數據,還能夠從新定義或加入新的數據和函數。函數
咱們瞭解類的成員能夠有public、protected、private三種訪問屬性,類的自身成員能夠訪問類中的任何成員,可是經過對象訪問的話,就只能訪問類的public(公有)成員。spa
類的繼承方式有public(公有繼承)、protected(保護繼承)、private(私有繼承)。設計
在派生類中,基類成員的訪問屬性能夠概括爲四種:不可直接訪問,public,protected,private。code
在基類中的訪問屬性對象 |
繼承方式blog |
在派生類中的訪問屬性繼承 |
privateci |
publictable |
不可直接訪問 |
private |
private |
不可直接訪問 |
private |
protected |
不可直接訪問 |
protected |
public |
protected |
protected |
private |
private |
protected |
protected |
protected |
public |
public |
public |
public |
private |
private |
public |
protected |
protected |
概括一下就是:
(1). 基類的私有成員
不管是那種繼承方式,基類的私有成員都不容許派生類繼承。也就是派生類中不可直接訪問的。
(2). 基類的保護成員
公有繼承時,基類中得全部公有成員在派生類中以保護成員的身份出現。
保護繼承時,基類中得全部保護成員在派生類中以保護成員的身份出現。
私有繼承時,基類中得全部私有成員在派生類中以私有成員的身份出現。
(3). 基類的公有成員
公有繼承時,基類中得全部公有成員在派生類中以公有成員的身份出現。
保護繼承時,基類中得全部保護成員在派生類中以保護成員的身份出現。
私有繼承時,基類中得全部私有成員在派生類中以私有成員的身份出現。
咱們都知道,派生類對基類的訪問形式主要有如下兩種方式:(1).內部訪問,有派生類新增的成員對基類繼承過來的成員進行訪問。(2).對象訪問,在派生類的外部,經過定義派生類的對象來對基類繼承來得成員進行訪問。
那咱們來分析三種繼承方式下面,派生類對基類的訪問規則。
i. 私有繼承的訪問規則
基類成員 |
Private成員 |
Public成員 |
Protected成員 |
內部訪問 |
不可訪問 |
能夠訪問 |
能夠訪問 |
對象訪問 |
不可訪問 |
不可訪問 |
不可訪問 |
首先,咱們根據一個具體的例子來看一下。
1 //基類 2 class Base 3 { 4 public: 5 Base(int a, int b, int c): x(a),y(b),z(c) 6 {} 7 virtual ~Base(void); 8 9 int x; 10 void printX() 11 { 12 printZ(); // 間接的訪問基類的private成員 13 printf("X = %d\n", x); 14 } 15 16 protected: 17 int y; 18 void printY() 19 { 20 printf("Y = %d\n", y); 21 } 22 23 private: 24 int z; 25 void printZ() 26 { 27 printf("Z = %d\n", z); 28 } 29 }; 30 31 //派生類 32 #include "base.h" 33 34 class Derivel : 35 private Base 36 { 37 public: 38 Derivel(int a, int b, int c):Base(a,b,c) 39 {} 40 virtual ~Derivel(void); 41 42 void show() 43 { 44 printX(); // 正確,基類的公有成員,派生類內部訪問可能 45 printY(); // 正確,基類的保護成員,派生類內部訪問可能 46 printZ(); // 錯誤,基類的私有成員,派生類不能內部訪問 47 } 48 }; 49 50 // main 51 #include "Base.h" 52 #include "Derivel.h" 53 54 int _tmain(int argc, _TCHAR* argv[]) 55 { 56 Derivel a(1,2,3); 57 58 a.printX(); 59 // 錯誤,基類的公有成員,私有繼承後做爲派生類的私有成員,不能外部訪問 60 a.printY(); 61 // 錯誤,基類的保護成員,私有繼承後做爲派生類的私有成員,不能外部訪問 62 a.printZ(); 63 // 錯誤,基類的私有成員,私有繼承後做爲派生類的私有成員,不能外部訪問 64 a.show(); 65 return 0; 66 }
總結:
當類的繼承方式爲私有繼承的時候,基類的public和protected成員被繼承後做爲派生類的私有成員。在類的外部經過派生類的對象沒法訪問,但在派生類的內部是能夠直接訪問的。基類的private成員在派生類的內部是不能直接訪問的,在派生類的外部一樣也是不能訪問的。若是你想訪問的話,能夠經過基類提供的public成員函數間接訪問。
ii. 公有繼承的訪問規則
基類成員 |
Private成員 |
Public成員 |
Protected成員 |
內部訪問 |
不可訪問 |
能夠訪問 |
能夠訪問 |
對象訪問 |
不可訪問 |
能夠訪問 |
不可訪問 |
首先,咱們根據一個具體的例子來看一下。
1 //基類 2 class Base 3 { 4 public: 5 Base(int a, int b, int c): x(a),y(b),z(c) 6 {} 7 virtual ~Base(void); 8 9 int x; 10 void printX() 11 { 12 printZ(); // 間接的訪問基類的private成員 13 printf("X = %d\n", x); 14 } 15 16 protected: 17 int y; 18 void printY() 19 { 20 printf("Y = %d\n", y); 21 } 22 23 private: 24 int z; 25 void printZ() 26 { 27 printf("Z = %d\n", z); 28 } 29 }; 30 31 //派生類 32 #include "base.h" 33 34 class Derivel : 35 public Base 36 { 37 public: 38 Derivel(int a, int b, int c):Base(a,b,c) 39 {} 40 virtual ~Derivel(void); 41 42 void show() 43 { 44 printX(); // 正確,基類的公有成員,派生類內部訪問可能 45 printY(); // 正確,基類的保護成員,派生類內部訪問可能 46 printZ(); // 錯誤,基類的私有成員,派生類不能內部訪問 47 } 48 }; 49 50 // main 51 #include "Base.h" 52 #include "Derivel.h" 53
54 int _tmain(int argc, _TCHAR* argv[]) 55 { 56 Derivel a(1,2,3); 57 a.printX(); 58 // 正確,基類的公有成員,公有繼承後做爲派生類的公有成員,能夠外部訪問 59 a.printY(); 60 // 錯誤,基類的保護成員,公有繼承後做爲派生類的保護成員,不能外部訪問 61 a.printZ(); 62 // 錯誤,基類的私有成員,公有繼承後做爲派生類的私有成員,不能外部訪問 63 a.show(); 64 return 0; 65 }
總結:
當類的繼承方式爲公有繼承的時候,基類的public成員被繼承後做爲派生類的公有成員。在類的外部經過派生類的對象和派生類的內部均可以直接訪問。基類的protected成員被繼承後做爲派生類的保護成員,在類的外部經過派生類的對象不能訪問,只能在派生類的內部訪問。基類的private成員被繼承後做爲派生類的私有成員,在派生類的內部是不能直接訪問的,在派生類的外部一樣也是不能訪問的。
iii. 保護繼承的訪問規則
基類成員 |
Private成員 |
Public成員 |
Protected成員 |
內部訪問 |
不可訪問 |
能夠訪問 |
能夠訪問 |
對象訪問 |
不可訪問 |
不可訪問 |
不可訪問 |
首先,咱們根據一個具體的例子來看一下。
1 // 基類 2 class Base 3 { 4 public: 5 Base(int a, int b, int c): x(a),y(b),z(c) 6 {} 7 virtual ~Base(void); 8 9 int x; 10 void printX() 11 { 12 printZ(); // 間接的訪問基類的private成員 13 printf("X = %d\n", x); 14 } 15 16 protected: 17 int y; 18 void printY() 19 { 20 printf("Y = %d\n", y); 21 } 22 23 private: 24 int z; 25 void printZ() 26 { 27 printf("Z = %d\n", z); 28 } 29 }; 30 31 // 派生類 32 #include "base.h" 33 34 class Derivel : 35 protected Base 36 { 37 public: 38 Derivel(int a, int b, int c):Base(a,b,c) 39 {} 40 virtual ~Derivel(void); 41 42 void show() 43 { 44 printX(); // 正確,基類的公有成員,派生類內部訪問可能 45 printY(); // 正確,基類的保護成員,派生類內部訪問可能 46 printZ(); // 錯誤,基類的私有成員,派生類不能內部訪問 47 } 48 }; 49 50 // main 51 #include "Base.h" 52 #include "Derivel.h" 53 54 int _tmain(int argc, _TCHAR* argv[]) 55 { 56 Derivel a(1,2,3); 57 a.printX(); 58 // 錯誤,基類的公有成員,保護繼承後做爲派生類的保護成員,不能外部訪問 59 a.printY(); 60 // 錯誤,基類的保護成員,保護繼承後做爲派生類的保護成員,不能外部訪問 61 a.printZ(); 62 // 錯誤,基類的私有成員,保護繼承後做爲派生類的私有成員,不能外部訪問 63 a.show(); 64 return 0; 65 }
總結:
當類的繼承方式爲保護繼承的時候,基類的public成員被繼承後做爲派生類的保護成員。在類的外部經過派生類的對象不能訪問,在派生類的內部能夠直接訪問。基類的protected成員被繼承後做爲派生類的保護成員,在類的外部經過派生類的對象不能訪問,只能在派生類的內部訪問。基類的private成員被繼承後做爲派生類的私有成員,在派生類的內部是不能直接訪問的,在派生類的外部一樣也是不能訪問的。