C++访问说明符public、protected、private

1、类内访问说明符

出现在类内部的访问说明符,作用如下代码及注释所示:

值得注意的是: 派生类的成员或者友元只能通过派生类对象来访问基类的受保护成员派生类对于一个基类对象中的受保护成员没有访问特权。下述代码举例进行了说明。

// 类内访问说明符,访问限制由弱到强排序:public > protected > private
class Base {
	// class默认为private,struct默认public
	int pri_mem1;
public:
	int pub_mem;	// public成员,对类的用户等均可以访问
protected:
	int prot_mem;	// protected成员,类的用户不可访问,对派生类的成员和友元可访问
private:
	int pri_mem;	// private成员,只有类本身可以访问
};

void test(Base &b)
{
	// 正确:可以访问Base的public成员
	b.pub_mem = 0;
	// 错误:无法访问Base的protected成员
	b.prot_mem = 0;
	// 错误:无法访问Base的private成员
	b.pri_mem = 0;
}

// Priv_Derv类继承Base类
class Priv_Derv : Base {
public:
// 注:派生类的成员或友元只能通过派生类对象访问基类的受保护成员。
// 派生类对于一个基类对象中的受保护成员没有访问特权
	void test(Base &b)
	{
		// 正确:可以访问Base的public成员
		b.pub_mem = 0;
		// 错误:派生类对于一个基类对象中的受保护成员没有访问特权
		b.prot_mem = 0;
		// 错误:无法访问Base的private成员
		b.pri_mem = 0;
	}

	void test(Priv_Derv &derv)
	{
		// 正确:可以访问Priv_Derv的public成员
		derv.pub_mem = 0;
		// 正确:派生类只能通过派生类对象访问基类的受保护成员。
		derv.prot_mem = 0;
		// 错误:无法访问Priv_Derv的private成员
		derv.pri_mem = 0;
	}
};

2、派生访问说明符

该访问说明符出现在派生类的派生列表中,如下代码所示:

值得注意的是:

  1. 派生类访问说明符对于派生类的成员(及友元)能否访问其直接基类的成员没有影响。对基类成员访问权限只与基类中的访问说明符有关。

  2. 派生访问说明符目的是控制派生类用户(包括派生类的派生类在内)对于基类成员访问权限,下述代码举例进行了说明。

class Base {
public:
	int pub_mem;	// public成员,对类的用户等均可以访问
protected:
	int prot_mem;	// protected成员,类的用户不可访问,对派生类的成员和友元可访问
private:
	int pri_mem;	// private成员,只有类本身可以访问
};

// 派生访问说明符,class默认为私有继承,struct默认为公有继承
// 注:1、派生类访问说明符对于派生类的成员能否访问其直接基类的成员没有影响

// 公有继承Base
class Pub_Derv : public Base {
	// 正确:派生类能访问protected成员
	int f() { return prot_mem; }
	// 错误:private成员对于派生类来说是不可访问的
	int g() { return pri_mem; }
};

// 私有继承Base
class Priv_Derv : private Base {
	// 正确:private不影响派生类对直接基类的访问权限
	int f1() const {return prot_mem;}
};

// 受保护的继承Base
class Prot_Derv : protected Base {
	// 正确:protected不影响派生类对直接基类的访问权限
	int f2() const {return prot_mem;}
};

// 2、派生访问说明符的目的是控制派生类用户(包括派生类的派生类在内)对于基类成员的访问权限
void test()
{
	Pub_Derv d1;		// 继承自Base的成员是public的
	Priv_Derv d2;		// 继承自Base的成员是private的
	d1.pub_mem = 0;		// 正确:pub_mem在派生类中是public的
	d2.pub_mem = 0;		// 错误:pub_mem在派生类中是private的
}

// struct和class的差异仅在于默认的访问说明符不同
struct Derived_from_Public : public Pub_Derv {
	// 正确:Base::prot_mem在Pub_Derv中仍然是protected的
	int use_base() { return prot_mem; }
};

struct Derived_from_Private : public Priv_Derv {
	// 错误:Base::prot_mem在Priv_Derv中是private的
	int use_base() { return prot_mem; }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值