【C++grammar】访问控制与抽象类与纯虚函数
目錄
- 一、訪問(wèn)控制 (可見性控制)
- 1.private、public、protected關(guān)鍵字
- 2.關(guān)鍵字示例
- 1、關(guān)鍵字對(duì)類數(shù)據(jù)成員訪問(wèn)的限制
- 3. 公有繼承
- 4. 私有繼承
- 5. 保護(hù)繼承
- 6. 私有繼承和保護(hù)繼承的區(qū)別
- 二、抽象類與純虛函數(shù)
- 1.什么是抽象類
- 2.抽象函數(shù)/純虛函數(shù)
- 3.抽象類示例
一、訪問(wèn)控制 (可見性控制)
1.private、public、protected關(guān)鍵字
1、the private and public keywords:
1、說(shuō)明數(shù)據(jù)及函數(shù)是否可以從類外面訪問(wèn)
2、私有成員只能在類內(nèi)的函數(shù)訪問(wèn)
3、公有成員可被任何其他類訪問(wèn)
2、the **protected ** keywords:
護(hù)屬性的數(shù)據(jù)或函數(shù)可被派生類成員訪問(wèn)
2.關(guān)鍵字示例
1、關(guān)鍵字對(duì)類數(shù)據(jù)成員訪問(wèn)的限制
#include <iostream> using namespace std; class A { public: // 訪問(wèn)屬性int i; protected:int j; private:int k; }; class B: public A { // 此public為派生方式 public: // 訪問(wèn)屬性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) 基類成員 在派生類中的訪問(wèn)屬性不變。
(2) 派生類的成員函數(shù) 可以訪問(wèn)基類的公有成員和保護(hù)成員,不能訪問(wèn)基類的私有成員;
(3) 派生類以外的其它函數(shù) 可以通過(guò)派生類的對(duì)象,訪問(wèn)從基類繼承的公有成員, 但不能訪問(wèn)從基類繼承的保護(hù)成員和私有成員。
4. 私有繼承
私有繼承的派生類定義形式:
class Derived:private Base{ 派生類新成員定義; };
(1) 基類成員 在派生類中都變成== private==。
(2) 派生類的成員函數(shù) 可以訪問(wèn)基類的公有成員和保護(hù)成員,不能訪問(wèn)基類的私有成員;
(3) 派生類以外的其它函數(shù) 不能通過(guò)派生類的對(duì)象,訪問(wèn)從基類繼承的任何成員。
5. 保護(hù)繼承
保護(hù)繼承的派生類定義形式:
class Derived:protected Base{ 派生類新成員定義; };
(1) 基類成員 公有成員和保護(hù)成員變成protected,私有成員不變。
(2) 派生類的成員函數(shù) 可以訪問(wèn)基類的公有成員和保護(hù)成員,不能訪問(wèn)基類的私有成員;
(3) 派生類以外的其它函數(shù) 不能通過(guò)派生類的對(duì)象,訪問(wèn)從基類繼承的任何成員。
6. 私有繼承和保護(hù)繼承的區(qū)別
二、抽象類與純虛函數(shù)
1.什么是抽象類
類太抽象以至于無(wú)法實(shí)例化就叫做抽象類。
2.抽象函數(shù)/純虛函數(shù)
從繼承鏈上來(lái)看:
1、派生類時(shí),新類會(huì)越來(lái)越明確和具體
2、沿著派生類向父類移動(dòng),類會(huì)越來(lái)越一般化和抽象
3、如果我們沿著繼承鏈一直往上找,遇到了一個(gè)類,這個(gè)類十分抽象以至于無(wú)法實(shí)例化,那么我們稱這個(gè)類為抽象類。
成員函數(shù)應(yīng)出現(xiàn)在哪個(gè)繼承層次?
假設(shè)有個(gè)Shape類,它有兩個(gè)派生類:rectangle、circle
rectangle、circle都可以求面積,都有一個(gè)getArea()函數(shù)。
對(duì)于getArea()函數(shù)的放置,我們有兩個(gè)選擇:
1、放哪兒都行,既可以放在基類Shape也可以放在子類中定義
2、Shape類定義中g(shù)etArea()函數(shù),并且強(qiáng)制要求Shape的子類必須實(shí)現(xiàn)getArea()
對(duì)于第二種方法,怎么實(shí)現(xiàn)強(qiáng)制要求呢?C++給出了抽象函數(shù)的概念:
抽象函數(shù)(abstract function) 也被稱為純虛函數(shù)(pure virtual function)
抽象函數(shù)要求子類實(shí)現(xiàn)它:
virtual double getArea() =0 ; //在Shape類中,注意這里不是大括號(hào),而是替換為=0,純虛函數(shù)的“純”就體現(xiàn)于此
Circle子類必須實(shí)現(xiàn)getArea()純虛函數(shù)才能實(shí)例化。
子類從基類將純虛函數(shù)繼承過(guò)來(lái),如果不進(jìn)行重新實(shí)現(xiàn)這個(gè)函數(shù),那么此時(shí)的子類也將是一個(gè)抽象類,不能實(shí)例化。
并且要在函數(shù)后面加上override,表明是對(duì)抽象函數(shù)的覆寫。
注意:純虛函數(shù)不需要定義函數(shù)體也不能定義函數(shù)體
3.抽象類示例
總結(jié)
以上是生活随笔為你收集整理的【C++grammar】访问控制与抽象类与纯虚函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【C++grammar】多态、联编、虚函
- 下一篇: 男枪二觉终于出来了。哪个职业尤其突出呢?