国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C/C++ 公有繼承、保護(hù)繼承和私有繼承的對比詳解

2020-01-26 14:15:09
字體:
供稿:網(wǎng)友

C/C++ 公有繼承、保護(hù)繼承和私有繼承的區(qū)別

   在c++的繼承控制中,有三種不同的控制權(quán)限,分別是public、protected和private。定義派生類時(shí),若不顯示加上這三個(gè)關(guān)鍵字,就會(huì)使用默認(rèn)的方式,用struct定義的類是默認(rèn)public繼承,class定義的類是默認(rèn)private繼承。這和Java有很大的不同,Java默認(rèn)使用public繼承,而且只有公有繼承。

        1.使用public繼承時(shí),派生類內(nèi)部可以訪問基類中public和protected成員,但是類外只能通過派生類的對象訪問基類的public成員。

        (1)基類的public成員在派生類中依然是public的。

        (2)基類中的protected成員在派生類中依然是protected的。

        (3)基類中的private成員在派生類中不可訪問。

        2.使用protected繼承時(shí),派生類內(nèi)部可以訪問基類中public和protected成員,并且類外也不能通過派生類的對象訪問基類的成員(可以在派生類中添加公有成員函數(shù)接口間接訪問基類中的public和protected成員)。

        (1)基類的public成員在派生類中變?yōu)閜rotected成員。

        (2)基類的protected成員在派生類中依然是protected成員。

        (3)基類中的private成員在派生類中不可訪問。

       3.使用private繼承時(shí),派生類內(nèi)部可以訪問基類中public和protected成員,并且類外也不能通過派生類的對象訪問基類的成員(可以在派生類中添加公有成員函數(shù)接口間接訪問基類中的public和protected成員)。

        (1)基類的public成員在派生類中變成private成員。

        (2)基類的protected成員在派生類中變成private成員。

        (3)基類的private成員在派生類中不可訪問。

        為了便于理解,我們用一個(gè)表格來說明這幾種控制符使用的情況:  

派 生 方 式  基類的public成員 基類的protected成員 基類的private成員
public派生 還是public成員 變?yōu)閜rotected成員 不可見
protected派生 變成protected成員    還是protected成員 不可見
private派生 變?yōu)閜rivate成員 變成private成員 不可見

       下面用代碼簡單敘述

#include <iostream> class Base { public:   int public_a;   virtual void test() = 0; protected:   int protected_a; private:   int private_a; }; //公有繼承 class PublicDerived : public Base { public:   virtual void test() {     public_a = 1;          //public_a public繼承后還是public類型     protected_a = 2;        //protected_a 還是protected類型     //private_a = 3;         //派生類不可訪問基類私有成員   } }; //保護(hù)繼承 class ProtectedDerived : protected Base { public:   virtual void test() {     public_a = 1;          //public_a protected繼承后變?yōu)閜rotected類型     protected_a = 2;        //protected_a 還是protected類型     //private_a = 3;        //派生類不可訪問基類私有成員   } }; //私有繼承 class PrivateDerived : private Base { public:   virtual void test() {     public_a = 1;          //public_a private繼承后變?yōu)閜rivate類型     protected_a = 2;        //protected_a private繼承后變?yōu)閜rivate類型     //private_a = 3;        //派生類不可訪問基類私有成員   } }; 

        在c++中public繼承是is-a的關(guān)系。也就說適用于基類身上的一定也適用于派生類身上,因?yàn)槊恳粋€(gè)派生類對象也都是一個(gè)基類對象。派生類對象轉(zhuǎn)換為基類對象在需要的時(shí)候是可以自動(dòng)轉(zhuǎn)化的。

        其實(shí),protected和private派生后的派生類不是基類的子類,因?yàn)榇伺缮惒荒茏龌愃茏龅乃惺虑椤N覀兛纯聪旅娴拇a

#include <iostream> class Person { public:   Person(){};   void eat() {std::cout << "eat/n";} }; //公有繼承 class PublicStudent : public Person { public:   PublicStudent() {}   void study() {std::cout << "study/n";} }; //保護(hù)繼承 class ProtectedStudent : protected Person { public:   ProtectedStudent() {}   void study() {std::cout << "study/n";} }; //私有繼承 class PrivateStudent : private Person { public:   PrivateStudent() {}   void study() {std::cout << "study/n";} };  void func_test(Person &p) {   p.eat(); } int main() {   PublicStudent public_s;   ProtectedStudent protected_s;   PrivateStudent private_s;   func_test(public_s);          //正確,公有繼承時(shí),派生類可以做基類的所有事情   func_test(protected_s);         //出錯(cuò),保護(hù)繼承時(shí),派生類不能做基類的所有事情   func_test(private_s);          //出錯(cuò),私有繼承時(shí),派生類不可以做基類的所有事情   system("pause");   return 0; } 

        func_test()需要一個(gè)Person類型的對象,在調(diào)用func_test(public_s)時(shí)實(shí)際傳遞的是PublicStudent對象,因?yàn)镻ublicStudent共有繼承Person類,所以PublicStudent對象可以使用Person類中所有的公有成員,也就是說基類對象可以做的事,公有繼承的派生類對象照樣可以做。而ProtectedStudent和PrivateStudent都是非公有有繼承,他們的對象不可以直接訪問Person類的成員。但是在他們派生類的對象空間中是包含基類的的對象,只是無法讓他們公開訪問。從上面的代碼可以看出來,protected繼承和private繼承的派生類已經(jīng)不是基類的子類了。

       寫了這么多,其實(shí)非公有繼承很少遇到。

 感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 老河口市| 克山县| 盱眙县| 都兰县| 杭州市| 清水河县| 襄汾县| 忻城县| 南康市| 基隆市| 孙吴县| 来凤县| 通河县| 西畴县| 皋兰县| 宜州市| 十堰市| 临夏县| 洪湖市| 城固县| 洛宁县| 克什克腾旗| 肥西县| 蓬莱市| 阳曲县| 峡江县| 井研县| 巴林右旗| 四子王旗| 宿迁市| 通辽市| 盐山县| 报价| 淳化县| 安宁市| 甘孜县| 三河市| 秦皇岛市| 东城区| 长子县| 务川|