C++ 公用、私有和受保護的繼承
《C++ Primer》中如下解釋公用、私有和受保護的繼承,本人感覺很重要,也煩了不少錯,覺得有必要記錄下來。
C++ 對類所繼承下來的成員的訪問方式由基類中的成員訪問級別和派生類的派生列表中使用的訪問標號共同控制: (1)如果成員的基類中位private,則只有基類和基類的友元可以訪問該成員。 派生類不能訪問基類的private成員,也不能使自己的使用者(即派生類的物件)訪問那些成員。 (2)如果基類成員為public 和 protected,則派生列表中使用的訪問標號決定該成員在派生類中的訪問級別: ①如果是公用繼承,基類成員保持自己的訪問級別:基類的 public 成員為派生類的 public 成員,基類的protected 成員為派生類的 protected 成員。 ②如果是受保護繼承,基類的 public 和 protected 成員在派生類中為 protected 成員。 ③如果是私有繼承,基類的的所有成員在派生類中為 private 成員。 |
注意:(2)中的紅色部分(即③)的含義與(1)中的紅色部分是不一樣的,一定區分清楚。基類的private成員,派生類及派生類物件是不可以對其訪問的;而如果是私有繼承下來的基類public 和 protected成員,在派生類中作為類本身的私有部分存在,也就是說,派生類的函式成員可以訪問這段區域。
下面看程式碼:
#include<iostream>
using namespace std;
class Base
{
public:
void basemen(){};
protected:
int i ;
} ;
struct Public_derived :public Base
{
int use_base(){return i;}
} ;
struct Private_derivad: private Base
{
int use_base(){return i;} //“基類的所有成員函式在派生類中位private成員 ”
} ;
struct Derived_form_Private : public Private_derivad
{
//int use_base(){ return i; } //bug: “派生類不可以訪問基類的private成員 ”
};
struct Derived_from_Public : public Public_derived
{
int use_base(){ return i; }
};
int main()
{
Base b ;
Public_derived d1;
Private_derivad d2;
b.basemen();
d1.use_base();
d2.use_base();
return 0;
}
這裡的Private_derivad的use_base函式可以訪問繼承基類下來的 i,這裡i作為Private_derivad類的一部分了,而Derived_form_Private繼承Private_derivad時,i作為Private_derivad的私有部分,“派生類不能訪問基類的private成員”。
至此,所有程式碼也就很好理解了。
相關文章
- 【C++基礎】公有,私有和受保護的繼承C++繼承
- C++繼承:公有,私有,保護C++繼承
- C++中公有繼承、保護繼承、私有繼承的區別C++繼承
- C++繼承詳解:共有(public)繼承,私有(private)繼承,保護(protected)繼承C++繼承
- 公有繼承、私有繼承和保護繼承之間的對比繼承
- [C++]繼承和派生類C++繼承
- C++繼承一之公有繼承C++繼承
- C++繼承C++繼承
- C++中的繼承C++繼承
- C++ | 類繼承C++繼承
- C++菱形繼承C++繼承
- [c++] 繼承和多型整理二C++繼承多型
- C++虛繼承的概念C++繼承
- 『無為則無心』Python物件導向 — 55、多層繼承和繼承中的私有成員Python物件繼承
- C++ class 和 struct 可以相互繼承嗎C++Struct繼承
- C++繼承體系C++繼承
- c++中的繼承關係C++繼承
- C++多繼承的細節C++繼承
- 玩家——受傷後的保護狀態
- JS原型繼承和類式繼承JS原型繼承
- C++中封裝和繼承的訪問許可權C++封裝繼承訪問許可權
- 說說C++多重繼承C++繼承
- c++ 虛繼承詳解C++繼承
- c++ 記憶體 繼承C++記憶體繼承
- C++ 整理15_繼承C++繼承
- C++ protected繼承意義C++繼承
- Aspose.Cells 讀取受保護的ExcelExcel
- C++的核心特性:繼承機制C++繼承
- C++繼承時的修飾符C++繼承
- odoo 繼承(owl繼承、web繼承、view繼承)Odoo繼承WebView
- 原型和繼承原型繼承
- c++語言中類的私有型別或保護型別成員變數C++型別變數
- 征服 JavaScript 面試:類繼承和原型繼承的區別JavaScript面試繼承原型
- C++高階教程之繼承得本質:單繼承(一)C++繼承
- C++學習筆記——C++ 繼承C++筆記繼承
- javascript的原型和繼承JavaScript原型繼承
- 類的繼承和派生繼承
- C++中的虛繼承的構造C++繼承