C++ 面向對象的三個特色--繼承與封裝(一)

面試的時候常常會有不少概念性的東西,許久不用都會很生疏,特地整理一下方便本身之後不記得了能夠查看一下,也順便幫助本身複習一下。面試

  • 概念

繼承是面向對象程序設計的一個重要特性,它容許在既有類的基礎上建立新的類,新類能夠從一個或者是多個既有類中繼承函數和數據,還能夠從新定義或加入新的數據和函數。函數

  • 基類成員在派生類中的訪問屬性概括

咱們瞭解類的成員能夠有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成員被繼承後做爲派生類的私有成員,在派生類的內部是不能直接訪問的,在派生類的外部一樣也是不能訪問的。

相關文章
相關標籤/搜索