码迷,mamicode.com
首页 > 其他好文 > 详细

protected、public、private

时间:2017-11-03 19:03:49      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:log   prot   类型转换   用户   roc   基类   类型   erro   补充   

一、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

标签:log   prot   类型转换   用户   roc   基类   类型   erro   补充   

原文地址:http://www.cnblogs.com/xzxl/p/7779194.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!