c++访问控制与继承

不考虑继承的话,我们可以认为一个类有两种不同的用户:普通用户类的实现者
普通用户编写的代码使用类的对象,这部分代码只能访问类的公有(接口)成员
实现者则负责编写类的成员和友元的代码,成员和友元既能访问 类的公有部分,也能访问类的私有(实现)部分

派生访问说明符对于派生类的成员(友元)能否访问其直接基类的成员没有影响,
对基类成员的访问权限只与基类中的访问说明符有关,
派生访问说明符的目的是控制派生类用户(包括派生类的派生类在内)对基类成员的访问权限

普通用户只能访问类的公有成员

普通用户对类的公有成员的访问还受到派生访问说明符的影响,即只能访问公有/继承的公有成员


//--------------------实现者的代码--------------------------
class test
{
public:
	int pub_test;
protected:
	int pro_test;
private:
	int pri_test;
};

class pub_derv : public test
{
	int p(){ return this->pro_test + this->pub_test; }
	//可以访问基类的公共和保护成员,不能访问私有成员
	friend int f(const pub_derv&);
};

class pro_derv : protected test
{
	int p() { return this->pro_test + this->pub_test; }
	//可以访问基类的公共和保护成员,不能访问私有成员
	friend int f(const pub_derv&);
};

class pri_derv : private test
{
	int p() { return this->pro_test + this->pub_test; }
	//可以访问基类的公共和保护成员,不能访问私有成员
	friend int f(const pub_derv&);
};
int f(const pub_derv &item){ return item.pub_test + item.pro_test; }

//可以访问基类的公共和保护成员,不能访问私有成员


//三个例子中都可以访问 pro_test, pub_test, 不能访问 pri_test
//--①--->说明派生访问说明符对于派生类的成员(友元)能否访问其直接基类的成员没有影响,
//对基类成员的访问权限只与基类中的访问说明符有关
//派生访问说明符的目的是控制派生类用户(包括派生类的派生类在内)对基类成员的访问权限

//--------------------普通用户的代码--------------------------
int main()
{

	test t;
	t.pub_test;
	/*
	t.pro_test; //错误,成员pro_test不可访问
	t.pri_test; //错误,成员pri_test不可访问
	*/
	//--②--->上面的例子说明普通用户只能访问类的公有成员

	pub_derv pubd;
	pubd.pub_test;
	//pubd.pro_test; //错误,test::pro_test,无法访问protected成员
	//pubd.pri_test; //错误,test::pri_test,无法访问private成员
	pro_derv prod;
	//prod.pub_test; //错误,test::pub_test不可访问,因为 pro_derv使用protected从test继承
	pri_derv prid;
	//prid.pub_test; //错误,test::pub_test不可访问,因为 pri_derv使用private从test继承
	//--③--->上面的例子说明普通用户对类的公有成员的访问还受到派生访问说明符的影响,即只能访问公有继承的公有成员

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值