C++非繼承時函數(shù)成員訪問屬性和類繼承過程中的訪問控制
一、非繼承時public、protected和private成員的訪問屬性
C++中保護成員使用protected進行聲明,那么protected、public和private三者有什么區(qū)別呢?
先說結(jié)論:非繼承時,protected
成員和private
成員沒有任何區(qū)別,都是類內(nèi)部可以直接訪問它們、類外部的類對象不可訪問它們、類內(nèi)部的類對象可以訪問它們;相比之下,public成員在類內(nèi)部、類外部的類對象、類內(nèi)部的類對象中都是可直接訪問的。
下面定 義的Bird類:
class Bird { public: ?? ?Bird() {? ?? ??? ?eat(); ? // 正確,類內(nèi)可以訪問保護成員 ?? ?}; protected: ?? ?void eat() { printf("Bird eating \n"); } };
上述代碼表明,類內(nèi)是可以直接訪問protected成員的,下面來看類外部的類對象:
int main() { ?? ?Bird bird(); ?? ?bird.eat(); ?// 錯誤,protected成員類外部對象不可訪問 }
上述代碼表明,類外部類對象是不能直接訪問protected
成員的。
所以說,非繼承時protected
成員和private
成員沒有差別。它們真正展示出差異是在“基類和子類的繼承”時,具體分析留在后面日志。
重點:上述分析強調(diào)了“類外部的類對象和類內(nèi)部的類對象”是不同的(類內(nèi)部類對象是指:Bird類的復制構(gòu)造函數(shù)就使用Bird類對象的引用可以訪問其私有成員和保護成員)。因此,才要特殊指明“類外部的類對象不能訪問protected和private成員,類內(nèi)部的類對象可以訪問其protected和private成員”。
二、C++類繼承過程中訪問控制
在子類繼承父類的過程中,子類可以指定以何種方式繼承父類:public
繼承、protected
繼承和private
繼承,這個過程可以稱為“訪問控制”。
在學習訪問控制之前,需要知道類含有三種成員:public
成員、protected
成員、private
成員。在非繼承的情況下,這三種成員的訪問屬性是不同的:public成員在類內(nèi)部和外部均可被直接訪問;protected和private成員均可以被類內(nèi)部和類內(nèi)部的類對象訪問,均不能被類外部的類對象訪問。為了便于自己記憶,稱這個規(guī)則為“非繼承時三種成員的訪問法則”
此知識點的復雜性在于繼承方式有三種,每種繼承方式又對應(yīng)三種成員,所以一共是九種情況。
為此,采用表格形式記錄如下:
上表中“子類吸收后”表示父類成員在子類中是何種身份(身份指:public
或protected
或private
),也就是說不同的繼承類型使得父類成員在子類中的身份不同。
比如:在protected繼承類型中,父類中的public
成員對應(yīng)在子類中為protected成員,此時子類內(nèi)部(指成員函數(shù)和子類對象)可以訪問該protected成員,但是子類外部的子類對象無法訪問該成員。也就是說,通過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ù)。子類可以通過選擇不同的繼承方式,改變這幾個函數(shù)在子類中的訪問屬性:
class Duck:public Animal { public: ?? ?Duck(int age_) :Animal(age_) {? ?? ??? ?printf("init Duck! \n"); ?? ??? ?run(); // 正確,子類內(nèi)部可以訪問基類public成員 ?? ??? ?eat(); // 正確,子類內(nèi)部可以訪問基類protected成員 ?? ??? ?showAge(); // 錯誤,子類內(nèi)部不可訪問基類的private成員 ?? ?}; };
總結(jié):
按照自己目前的理解,不管繼承方式為public
、protected
和private
三種中的哪一個,父類的private成員對應(yīng)到子類中均“不可直接訪問”。此外,子類不繼承父類的構(gòu)造函數(shù)和析構(gòu)函數(shù)。
疑惑:
書中所說的“不可直接訪問”,目前自己并不知道如何間接訪問,猜測可能是采用 “get” 和 “set” 方式進行間接訪問。
到此這篇關(guān)于C++非繼承時函數(shù)成員訪問屬性和類繼承過程中的訪問控制的文章就介紹到這了,更多相關(guān)C++非繼承和類繼承訪問內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt中const?QString轉(zhuǎn)換?char?*可能的坑
本文主要介紹了Qt中const?QString轉(zhuǎn)換?char?*可能的坑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07C/C++ Qt TreeWidget 嵌套節(jié)點操作使用
本文主要介紹了TreeWidget的如何使用,實現(xiàn)對樹形框多節(jié)點的各種操作,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11