【C++】访问的控制与继承

8 篇文章 0 订阅

访问说明符

访问说明符本类内友元子类内类外
private××
protected×
public

(默认成员的访问权限是private的)
样例:

class A {
	int a;		//默认为private
public:
	int b;
protected:
	int c;
private:
	int d;

public:
	void func() {
		//类内都可访问
		a = 0;
		b = 0;
		c = 0;
		d = 0;
	}
	friend void AFriend(A &a);
};

class B : public A {
public:
	void func() {
		//子类只有父类部分的public和protected可以访问
		//a = 0;
		b = 0;
		c = 0;
		//d = 0;
	}

	void testA(A& a) {
		this->c;	//可以访问
		//不可访问:派生类只能访问自身基类部分的protcted成员,
		//对于其它的基类对象的protected成员不可访问
		//cout << a.c;	
	}

void AFriend(A& a) {
	cout << a.a << endl;
}
int main() {
	A a;
	//a.a = 0;			//私有的,不可访问
	a.b = 0;
	//a.c = 0;				//受保护的,不可访问
	//a.d = 0;				//私有的,不可访问

	AFriend(a);

	return 0;
}

注意:派生类只能访问自身基类部分的protcted成员,对于其它的基类对象的protected成员是不可访问的。就好像父亲愿意给你的物品你可以拿,但是别人的父亲给自己儿子的物品你不能拿。

公有、私有和保护继承

某个类对其继承而来的成员的访问权限受到两个因素影响:一个是在在基类中该成员的访问说明符,另一个是继承时在派生列表中的访问说明符。

class AA : public A{}
class BA : public A{}
class CA : public A{}

需要注意的是,派生访问说明符对于派生类的成员(及友元)对基类成员的访问并不会有影响, 派生类能否访问基类成员只与基类成员的访问说明符有关。
派生访问说明符的目的是控制派生类的使用者(包括派生类的派生类)能否访问派生类的基类部分成员:
派生访问说明符对派生类内对基类成员访问不影响:

class A {
public:
	void pub_func(){}
protected:
	void pro_func(){}
private:
	void pri_func(){}
};

class PubA : public A {};
class ProA : protected A {};
class PriA : private A {
	void test() {
		//派生类内能否访问只与基类成员访问说明符有关
		pub_func();
		pro_func();
		//pri_func();			//私有的不可访问
	}
};


对派生类用户有影响:

int main() {
	PubA pubA;
	ProA proA;
	PriA priA;

	pubA.pub_func();
	//proA.pub_func();			//不可访问
	//priA.pub_func();				//不可访问

	return 0;
}

包括派生类的派生类:

class APubA : public PubA {
	void test() {
		//PubA公有继承自A,其子孙类对A的访问权限不变
		pub_func();
		pro_func();
		//pri_func();
	}
};

class BPubA : public ProA {
	void test() {
		//PubA保护继承自A,A的公开成员对BPubA为保护的
		pub_func();		//protected的
		pro_func();
		//pri_func();
	}
};

class CPubA : public PriA {
	void test() {
		//PubA私有继承自A,A的所有成员对CPubA为私有的
		//pub_func();
		//pro_func();
		//pri_func();
	}
};
改变个别成员的可访问性

如果需要修改派生类继承的基类的个别成员的访问级别,可以通过using声明来实现:

class A{
public:
	int pub_v;
protected:
	int pro_v;
}

class B : private A{			//私有继承
public:
	using A::pub_v;		//修改该成员访问级别
protected:
	using A::pro_v;
}

默认的继承保护级别

struct的默认继承级别是public的,而class的默认继承级别是private的。

struct B : A{}		//相当于struct B : public A{}
class B : A{}		//相当于class B : private A{}

补充:在C++中,其实struct和class唯一的差别就是默认成员访问说明符和默认派生访问说明符不同,除此之外使用上没有其他差别。

相关资料:
《C++Primer》第五版 7.2、15.5节

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值