C++繼承中的訪問控制實例分析
本文較為深入的探討了C++繼承中的訪問控制,對深入掌握C++面向?qū)ο蟪绦蛟O(shè)計是非常必要的。具體內(nèi)容如下:
通常來說,我們認(rèn)為一個類有兩種不同的用戶:普通用戶 和 類的實現(xiàn)者。其中,普通用戶編寫的代碼使用類的對象,這部分代碼只能訪問類的公有(接口)成員;實現(xiàn)者則負(fù)責(zé)編寫類的成員和友元的代碼,成員和友元既能訪問類的公有部分,也能訪問類的私有部分。如果進(jìn)一步考慮繼承的話就會出現(xiàn)第三種用戶,即派生類。派生類可以訪問基類的公有(public)成員和受保護(hù)(protected)成員,但不能訪問基類的私有(private)成員。
繼承相關(guān)點如下:
①.大多數(shù)類都只繼承自一個類,這種形式的繼承叫做“單繼承”。本文主要講的是單繼承。
②.一個派生類的對象中,包含繼承自基類的部分和派生類自定義的部分。正因為派生類含有基類部分,所以可以進(jìn)行派生類到基類的類型轉(zhuǎn)換,這種轉(zhuǎn)換是隱式的。
③.不存在從基類向派生類的隱式類型轉(zhuǎn)換。
④.派生類向基類的自動類型轉(zhuǎn)換只對指針或引用有效,對象之間不存在類型轉(zhuǎn)換。
⑤.如果基類定義了靜態(tài)成員,則不論派生出多少個派生類,每個靜態(tài)成員都只存在唯一實例。
⑥防止一個類被繼承可以使用關(guān)鍵字final,這時C++11新標(biāo)準(zhǔn)中提供的。
此外,讀者還需要了解一下前面文章所介紹的繼承中的虛函數(shù)與純虛函數(shù)。
一、公有、私有和受保護(hù)成員
1 . 訪問說明符
在C++中通過使用訪問說明符public、protected、private來對類的成員進(jìn)行訪問控制,控制成員對于普通用戶或派生類來說是否可訪問:
public:定義為public的成員對普通用戶、類的實現(xiàn)者、派生類都是可訪問的。public通常用于定義類的外部接口。
protected:定義protected成員的目的是讓派生類可以訪問而禁止其他用戶訪問。所以類的實現(xiàn)者和派生類可以訪問,而普通用戶不能訪問。
private:定義為private的成員只能被類的實現(xiàn)者(成員和友元)訪問。private部分通常用于封裝(即隱藏)類的實現(xiàn)細(xì)節(jié)。
class People{
protected:
string name;
};
class Student : public People{
public:
friend void Print(Student &s);
friend void Print(People &p);
};
// 正確,可以通過派生類對象訪問基類的protected成員
void Print(Student &s){ s.name="Songlee"; cout<< s.name << endl; }
// 錯誤,不能通過基類對象訪問基類的protected成員
void Print(People &p){ p.name="Songlee"; cout<< p.name << endl; }
需要注意的是,派生類的成員或友元只能通過派生類對象來訪問基類的受保護(hù)成員。派生類對于一個基類對象中的受保護(hù)成員沒有任何訪問特權(quán)。
2 . 改變成員的可訪問性
有時我們需要改變派生類繼承的某個名字的訪問級別,通過使用using聲明:
class People{
protected:
string name;
};
class Student : public People{
public:
using People::name; // 將繼承來的name成員的訪問權(quán)限改為public
};
int main()
{
Student me;
me.name = "SongLee"; // 可以訪問name了
cout << me.name << endl;
return 0;
}
通過在類的內(nèi)部使用using聲明語句,我們可以將該類的直接或間接基類中的任何可訪問成員(非私有成員)標(biāo)記出來,改變其訪問權(quán)限。
二、公有、私有和受保護(hù)繼承
我們注意到,在類的派生列表中用到了訪問說明符public、protected和private,它們分別表示不同的繼承方式:
class A : public B { /* */ }; // 公有繼承
class A : private B { /* */ }; // 私有繼承
class A : protected B { /* */ }; // 受保護(hù)繼承
派生類的派生列表中的訪問說明符對于派生類的成員(及友元)能否訪問其直接基類的成員沒什么影響。派生類的成員(及友元)對基類成員的訪問權(quán)限只與基類中的訪問說明符有關(guān)。
那么派生列表中的訪問說明符有什么作用呢?
派生列表中訪問說明符的作用是控制派生類用戶對于基類成員的訪問權(quán)限,注意是派生類的用戶。下面給出不同的繼承方式導(dǎo)致的訪問權(quán)限的變化:
public繼承:如果繼承是公有的,則成員將遵循其原有的訪問說明符。父類中的public、protected和private屬性在子類中不發(fā)生改變。
protected繼承:比protected級別高的訪問權(quán)限會變成protected。即父類中的public屬性在子類中變?yōu)閜rotected,父類中的protected和private屬性在子類中不變。
private繼承:比private級別高的訪問權(quán)限會變成private。即父類中的三種訪問屬性在子類中都會變成private。
class A { // 基類
public:
string A_public; // 公有成員
protected:
string A_protected; // 受保護(hù)成員
};
class B : private A { // 私有繼承
public:
B(){ A_public="public"; A_protected="protected"; };
};
int main()
{
B b; // 通過B的對象訪問
cout << b.A_public <<" "<< b.A_protected << endl; // 錯誤,因為是私有繼承
return 0;
}
如果我們在派生列表中不使用訪問說明符,則struct關(guān)鍵字默認(rèn)的是公有繼承,class關(guān)鍵字默認(rèn)的是私有繼承。不過建議在繼承時最好顯式地將訪問說明符寫出來。
另外,不同的繼承方式也會影響派生類向基類的轉(zhuǎn)換,假定Derive繼承自Base:
1.只有當(dāng)Derive公有地繼承自Base時,用戶代碼才能使用派生類向基類的轉(zhuǎn)換;如果Derive繼承Base的方式是受保護(hù)的或者私有的,則用戶代碼不能使用該轉(zhuǎn)換。
2.不論Derive以什么方式繼承Base,Derive的成員函數(shù)和友元都能使用派生類向基類的轉(zhuǎn)換;派生類向其直接基類的類型轉(zhuǎn)換對于派生類的成員和友元來說永遠(yuǎn)是可訪問的。
3.如果Derive繼承Base的方式是公有的或者受保護(hù)的,則Derive的派生類的成員和友元可以使用Derive向Base的類型轉(zhuǎn)換;反之,如果Derive繼承Base的方式是私有的,則不能使用。
上一篇:使用WindowsAPI實現(xiàn)播放PCM音頻的方法
欄 目:C語言
本文標(biāo)題:C++繼承中的訪問控制實例分析
本文地址:http://m.jygsgssxh.com/a1/Cyuyan/3480.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)
- 01-10用C++實現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實現(xiàn)與遞歸實現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實例總結(jié)


