C++非繼承時(shí)函數(shù)成員訪問(wèn)屬性和類繼承過(guò)程中的訪問(wèn)控制

一、非繼承時(shí)public、protected和private成員的訪問(wèn)屬性
C++中保護(hù)成員使用protected進(jìn)行聲明,那么protected、public和private三者有什么區(qū)別呢?
先說(shuō)結(jié)論:非繼承時(shí),protected成員和private成員沒(méi)有任何區(qū)別,都是類內(nèi)部可以直接訪問(wèn)它們、類外部的類對(duì)象不可訪問(wèn)它們、類內(nèi)部的類對(duì)象可以訪問(wèn)它們;相比之下,public成員在類內(nèi)部、類外部的類對(duì)象、類內(nèi)部的類對(duì)象中都是可直接訪問(wèn)的。
下面定 義的Bird類:
class Bird {
public:
?? ?Bird() {?
?? ??? ?eat(); ? // 正確,類內(nèi)可以訪問(wèn)保護(hù)成員
?? ?};
protected:
?? ?void eat() { printf("Bird eating \n"); }
};上述代碼表明,類內(nèi)是可以直接訪問(wèn)protected成員的,下面來(lái)看類外部的類對(duì)象:
int main() {
?? ?Bird bird();
?? ?bird.eat(); ?// 錯(cuò)誤,protected成員類外部對(duì)象不可訪問(wèn)
}上述代碼表明,類外部類對(duì)象是不能直接訪問(wèn)protected成員的。
所以說(shuō),非繼承時(shí)protected成員和private成員沒(méi)有差別。它們真正展示出差異是在“基類和子類的繼承”時(shí),具體分析留在后面日志。
重點(diǎn):上述分析強(qiáng)調(diào)了“類外部的類對(duì)象和類內(nèi)部的類對(duì)象”是不同的(類內(nèi)部類對(duì)象是指:Bird類的復(fù)制構(gòu)造函數(shù)就使用Bird類對(duì)象的引用可以訪問(wèn)其私有成員和保護(hù)成員)。因此,才要特殊指明“類外部的類對(duì)象不能訪問(wèn)protected和private成員,類內(nèi)部的類對(duì)象可以訪問(wèn)其protected和private成員”。
二、C++類繼承過(guò)程中訪問(wèn)控制
在子類繼承父類的過(guò)程中,子類可以指定以何種方式繼承父類:public繼承、protected繼承和private繼承,這個(gè)過(guò)程可以稱為“訪問(wèn)控制”。
在學(xué)習(xí)訪問(wèn)控制之前,需要知道類含有三種成員:public成員、protected成員、private成員。在非繼承的情況下,這三種成員的訪問(wèn)屬性是不同的:public成員在類內(nèi)部和外部均可被直接訪問(wèn);protected和private成員均可以被類內(nèi)部和類內(nèi)部的類對(duì)象訪問(wèn),均不能被類外部的類對(duì)象訪問(wèn)。為了便于自己記憶,稱這個(gè)規(guī)則為“非繼承時(shí)三種成員的訪問(wèn)法則”
此知識(shí)點(diǎn)的復(fù)雜性在于繼承方式有三種,每種繼承方式又對(duì)應(yīng)三種成員,所以一共是九種情況。
為此,采用表格形式記錄如下:

上表中“子類吸收后”表示父類成員在子類中是何種身份(身份指:public或protected或private),也就是說(shuō)不同的繼承類型使得父類成員在子類中的身份不同。
比如:在protected繼承類型中,父類中的public成員對(duì)應(yīng)在子類中為protected成員,此時(shí)子類內(nèi)部(指成員函數(shù)和子類對(duì)象)可以訪問(wèn)該protected成員,但是子類外部的子類對(duì)象無(wú)法訪問(wèn)該成員。也就是說(shuō),通過(guò)protected類型的繼承,該成員從父類中的public成員變?yōu)樽宇愔械膒rotected成員。
下面是public繼承的例子,其中父類為Animal,子類為Duck:
class Animal {
public:
?? ?Animal(int age_) { age = age_; printf("Init Animal \n");?
?? ?}
?? ?void eat() { printf("Animal eating! \n"); }
protected:
?? ?void run() { printf("Animal Running! \n"); }
private:
?? ?int age=0;
?? ?void showAge() { printf("Age is %d", age); }
};父類Animal中分別定義了public類型的eat()函數(shù)、protected類型的run()函數(shù)、private類型的showAge()函數(shù)。子類可以通過(guò)選擇不同的繼承方式,改變這幾個(gè)函數(shù)在子類中的訪問(wèn)屬性:
class Duck:public Animal {
public:
?? ?Duck(int age_) :Animal(age_) {?
?? ??? ?printf("init Duck! \n");
?? ??? ?run(); // 正確,子類內(nèi)部可以訪問(wèn)基類public成員
?? ??? ?eat(); // 正確,子類內(nèi)部可以訪問(wèn)基類protected成員
?? ??? ?showAge(); // 錯(cuò)誤,子類內(nèi)部不可訪問(wèn)基類的private成員
?? ?};
};總結(jié):
按照自己目前的理解,不管繼承方式為public、protected和private三種中的哪一個(gè),父類的private成員對(duì)應(yīng)到子類中均“不可直接訪問(wèn)”。此外,子類不繼承父類的構(gòu)造函數(shù)和析構(gòu)函數(shù)。
疑惑:
書(shū)中所說(shuō)的“不可直接訪問(wèn)”,目前自己并不知道如何間接訪問(wèn),猜測(cè)可能是采用 “get” 和 “set” 方式進(jìn)行間接訪問(wèn)。
到此這篇關(guān)于C++非繼承時(shí)函數(shù)成員訪問(wèn)屬性和類繼承過(guò)程中的訪問(wèn)控制的文章就介紹到這了,更多相關(guān)C++非繼承和類繼承訪問(wèn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言中無(wú)符號(hào)與有符號(hào)及相加問(wèn)題
這篇文章主要介紹了C語(yǔ)言中無(wú)符號(hào)與有符號(hào)及相加問(wèn)題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08
6個(gè)變態(tài)的C語(yǔ)言Hello World程序
這篇文章主要介紹了6個(gè)變態(tài)的C語(yǔ)言Hello World程序,需要的朋友可以參考下2016-05-05
C語(yǔ)言如何實(shí)現(xiàn)一些算法或者函數(shù)你知道嗎
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)一些算法或者函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03
從零學(xué)習(xí)構(gòu)造系統(tǒng)之bazel示例詳解
這篇文章主要為大家介紹了從零學(xué)習(xí)構(gòu)造系統(tǒng)之bazel示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
C語(yǔ)言實(shí)現(xiàn)通訊錄功能的流程與代碼
通訊錄是一個(gè)可以記錄親人、好友信息的工具,這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)通訊錄管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
Visual?Studio?2022使用MinGW來(lái)編譯調(diào)試C/C++程序的圖文教程
這篇文章主要介紹了Visual?Studio?2022使用MinGW來(lái)編譯調(diào)試C/C++程序,以實(shí)例來(lái)簡(jiǎn)單介紹一下VS2022中如何使用MinGW來(lái)編譯、調(diào)試C/C++程序,需要的朋友可以參考下2022-08-08
C++超詳細(xì)講解強(qiáng)制類型轉(zhuǎn)換的用法
在C++語(yǔ)言中新增了四個(gè)關(guān)鍵字static_cast、const_cast、reinterpret_cast和dynamic_cast。這四個(gè)關(guān)鍵字都是用于類型轉(zhuǎn)換的,類型轉(zhuǎn)換(type?cast),是高級(jí)語(yǔ)言的一個(gè)基本語(yǔ)法。它被實(shí)現(xiàn)為一個(gè)特殊的運(yùn)算符,以小括號(hào)內(nèi)加上類型名來(lái)表示,接下來(lái)讓我們一起來(lái)詳細(xì)了解2022-06-06
基于Matlab實(shí)現(xiàn)多目標(biāo)粘液霉菌算法的示例代碼
多目標(biāo)粘液霉菌算法(MOSMA),這是最近開(kāi)發(fā)的粘液霉菌算法(SMA)的多目標(biāo)變體,用于處理工業(yè)中的多目標(biāo)優(yōu)化問(wèn)題。本文將用Matlab實(shí)現(xiàn)這一算法,需要的可以參考一下2022-05-05

