目錄
- 一、訪問控制 (可見性控制)
- 1.private、public、protected關鍵字
- 2.關鍵字示例
- 1、關鍵字對類數據成員訪問的限制
- 3. 公有繼承
- 4. 私有繼承
- 5. 保護繼承
- 6. 私有繼承和保護繼承的區別
- 二、抽象類與純虛函數
- 1.什么是抽象類
- 2.抽象函數/純虛函數
- 3.抽象類示例
一、訪問控制 (可見性控制)
1.private、public、protected關鍵字
1、the private and public keywords:
1、說明數據及函數是否可以從類外面訪問
2、私有成員只能在類內的函數訪問
3、公有成員可被任何其他類訪問
2、the **protected ** keywords:
護屬性的數據或函數可被派生類成員訪問
2.關鍵字示例
1、關鍵字對類數據成員訪問的限制
#include <iostream>
using namespace std;
class A {
public: // 訪問屬性int i;
protected:int j;
private:int k;
};
class B: public A { // 此public為派生方式
public: // 訪問屬性void display() {cout << i << endl; // OK, can access icout << j << endl; // OK, can access jcout << k << endl; // Error! cannot access k}
};
int main() {A a;cout << a.i << endl; // OK, can access a.icout << a.j << endl; // Error, cannot access a.jcout << a.k << endl; // Error, cannot access a.k
}
3. 公有繼承
公有繼承的派生類定義形式:
class Derived:public Base{ 派生類新成員定義; };
(1) 基類成員 在派生類中的訪問屬性不變。
(2) 派生類的成員函數 可以訪問基類的公有成員和保護成員,不能訪問基類的私有成員;
(3) 派生類以外的其它函數 可以通過派生類的對象,訪問從基類繼承的公有成員, 但不能訪問從基類繼承的保護成員和私有成員。
4. 私有繼承
私有繼承的派生類定義形式:
class Derived:private Base{ 派生類新成員定義; };
(1) 基類成員 在派生類中都變成== private==。
(2) 派生類的成員函數 可以訪問基類的公有成員和保護成員,不能訪問基類的私有成員;
(3) 派生類以外的其它函數 不能通過派生類的對象,訪問從基類繼承的任何成員。
5. 保護繼承
保護繼承的派生類定義形式:
class Derived:protected Base{ 派生類新成員定義; };
(1) 基類成員 公有成員和保護成員變成protected,私有成員不變。
(2) 派生類的成員函數 可以訪問基類的公有成員和保護成員,不能訪問基類的私有成員;
(3) 派生類以外的其它函數 不能通過派生類的對象,訪問從基類繼承的任何成員。
6. 私有繼承和保護繼承的區別
二、抽象類與純虛函數
1.什么是抽象類
類太抽象以至于無法實例化就叫做抽象類。
2.抽象函數/純虛函數
從繼承鏈上來看:
1、派生類時,新類會越來越明確和具體
2、沿著派生類向父類移動,類會越來越一般化和抽象
3、如果我們沿著繼承鏈一直往上找,遇到了一個類,這個類十分抽象以至于無法實例化,那么我們稱這個類為抽象類。
成員函數應出現在哪個繼承層次?
假設有個Shape類,它有兩個派生類:rectangle、circle
rectangle、circle都可以求面積,都有一個getArea()函數。
對于getArea()函數的放置,我們有兩個選擇:
1、放哪兒都行,既可以放在基類Shape也可以放在子類中定義
2、Shape類定義中getArea()函數,并且強制要求Shape的子類必須實現getArea()
對于第二種方法,怎么實現強制要求呢?C++給出了抽象函數的概念:
抽象函數(abstract function) 也被稱為純虛函數(pure virtual function)
抽象函數要求子類實現它:
virtual double getArea() =0 ; //在Shape類中,注意這里不是大括號,而是替換為=0,純虛函數的“純”就體現于此
Circle子類必須實現getArea()純虛函數才能實例化。
子類從基類將純虛函數繼承過來,如果不進行重新實現這個函數,那么此時的子類也將是一個抽象類,不能實例化。
并且要在函數后面加上override,表明是對抽象函數的覆寫。
注意:純虛函數不需要定義函數體也不能定義函數體