protected、public、private

一、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的公有成员)

小结:对于代码中的某个给定节点来说,如果基类的公有成员是可访问的,则派生类向基类的类型转换也是可访问的。

 

 

 

posted @ 2017-11-03 17:19  GGBeng  阅读(358)  评论(0编辑  收藏  举报