程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 第15章 面向對象編程(4)

第15章 面向對象編程(4)

編輯:C++入門知識

15.2.5 公有、私有和受保護的繼承
對類所繼承的成員的訪問由基類中的成員訪問級別和派生類派生列表中使用的訪問標號共同控制。
每個類控制它所定義的成員的訪問。派生類可以進一步限制但不能放松對所繼承的成員的訪問。
派生類不能訪問基類的private成員,也不能使自己的用戶能夠訪問那些成員。如果基類成員為public或protected,則派生列表中使用的訪問標號決定該成員在派生類中的訪問級別。
如果是公有繼承(public inheritance),基類成員保持自己的訪問級別:基類的public成員為派生類的public成員,基類的protected成員為派生類的protected成員。
如果是受保護繼承(protected inheritance),基類的public和protected成員在派生類中為protected成員。
如果是私有繼承(private inheritance),基類的所有成員在派生類中為private成員。

class Base{ 
protected: 
    int i; 
}; 
 
class Child1:private Base{ 
public: 
    int GetValue(){ 
        return i; 
    } 
}; 
無論派生列表中是什麼訪問標號,所有繼承Base的類對Base中的成員具有相同的訪問。派生訪問標號將控制派生類的用戶對從Base繼承而來的成員的訪問。
派生訪問標號還控制來自非直接派生類的訪問。
1. 接口繼承與實現繼承
public派生類繼承基類的接口,它具有與基類相同的接口。設計良好的類層次中,public派生類的對象可以用在任何需要基類對象的地方。
使用private或protected派生的類不繼承基類的接口,相反,這些派生通常被稱為實現繼承。派生類在實現中使用被繼承類但繼承基類的部分並未成為其接口的一部分。
迄今為止,最常見的繼承形式是public。
2.去除個別成員
如果進行private或protected繼承,則基類成員的訪問級別在派生類中比在基類中更受限。
派生類可以恢復繼承成員的訪問級別,但不能使訪問級別比基類中原來指定的更嚴格或更寬松。

class Base{ 
protected: 
    int i; 
}; 
 
class Child1:private Base{ 
protected: 
    using Base::i; 
public: 
    int GetValue(){ 
        return i; 
    } 
}; 
正如可以使用using聲明從命名空間使用名字,也可以使用using聲明訪問基類中的名字,除了在作用域操作符左邊用類名字代替命名空間名字之外,使用形式是相同的。
3. 默認繼承保護級別
用struct和class保留字定義的類具有不同的默認訪問級別,同樣默認繼承訪問級別根據使用那個保留字定義派生類也不相同。使用class保留字定義的派生類默認有private繼承,而用struct保留字定義的類默認具有public繼承。
struct保留字定義的類與class定義的類唯一的不同只是默認的成員保護級別和默認的派生保護級別,沒有其他區別。
盡管私有繼承在使用class保留字時時默認情況,但這在實踐中相對罕見。因為私有繼承是如此罕見,通常顯式指定private是比依賴於默認更好的辦法。顯式指定可清除指出想要私有繼承而不是一時疏忽。

摘自 xufei96的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved