1. 程式人生 > >protected、public、private

protected、public、private

無法 說明符 nbsp 例子 span 包括 派生 pre 用戶

一、protected成員

1. 受保護的成員的可訪問性

  • 對於一個類的protected成員,①該類的用戶(如類對象)不能訪問它,②該類的派生類的成員(及其友元)可以訪問它。
  • 派生類的成員及其友元不能訪問其基類對象的受保護成員,它們只能訪問繼承到派生類對象中的受保護成員
  • 派生類的成員及其友元只能訪問派生類對象中的基類部分的protected成員,不能訪問普通的基類對象中的protected成員

借助下面的例子加深理解:

class Base {
protected:
	int proc = 0;
};

class Derv : public Base {
	void set_base_false()
	{ 
		Base b;
		b.proc = 1; 		//[Error] ‘int Base::proc‘ is protected
	}
	void set_base_true()
	{
		Derv d;
		d.proc = 1;
	}
	void set_base_true2()
	{
		proc = 1;			//訪問該派生類繼承而來的proc成員 
	}
};

二、三種繼承方式

1. 派生訪問說明符

對於派生類的成員及友元能否訪問其直接基類的成員沒什麽影響

目的:控制派生類用戶(包括派生類的派生類在內)對於基類成員的訪問權限

2. 繼承方式不影響派生類的成員及其友元訪問基類的成員

class Base {
public:
	void pub_mem();
protected:
	int prot_mem;
private:
	int priv_mem;
};

//公有繼承 
class Pub_derv : public Base {
	int f1() { pub_mem(); }
	int f2() { return prot_mem; }
	int f3() { return priv_mem; }		//錯誤:派生類不可訪問private成員
};

//私有繼承 
class Priv_derv : private Base {
	int f1() { pub_mem(); }
	int f2() { return prot_mem; }
	int f3() { return priv_mem; }		//錯誤:派生類不可訪問private成員
};

3. 繼承方式影響派生類對象及其派生類訪問基類的成員

公有繼承:派生類中(從基類中)繼承而來的成員都遵循其原有的訪問說明符

私有繼承:派生類中(從基類中)繼承而來的成員的訪問說明符都是private

保護繼承:派生類中(從基類中)繼承而來的成員,若其在基類中的訪問說明符是public,則在派生類中的訪問說明符變為protected

	Pub_derv d1;		//公有繼承而來的派生類對象d1 
	Priv_derv d2;		//私有繼承而來的派生類對象d2 
	d1.pub_mem(); 		//正確:pub_mem()在派生類中是public的 
	cout << d1.prot_mem << endl; 	//錯誤:prot_mem在派生類中是protected的,但類的對象無法訪問protected成員
	d2.pub_mem(); 		//錯誤:pub_mem()在派生類中是private的 

補充:其實題目中所說的基類的成員是指繼承到派生類中的基類的成員(即,派生類的成員的基類部分

三、派生類向基類轉換的可訪問性

0. 影響因素

使用該轉換的代碼

派生類的派生訪問說明符

1. D繼承自B

  • D公有地繼承B時,用戶代碼才能使用派生類向基類的轉換(用戶代碼可訪問B的公有成員)
  • 如果B是D的直接基類,則D的成員和友元可以使用派生類向基類的轉換(D的成員和友元可訪問B的公有成員)
  • D不是私有地繼承B時,則D的派生類的成員和友元可以使用D向B的類型轉換(D的派生類的成員和友元可訪問B的公有成員)

小結:對於代碼中的某個給定節點來說,如果基類的公有成員是可訪問的,則派生類向基類的類型轉換也是可訪問的。

protected、public、private