C++ 公用、私有和受保護的繼承

GeekWay發表於2012-08-30

   《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成員”。
    至此,所有程式碼也就很好理解了。





相關文章