C++:public、protected、private 权限及继承详解

class BaseClass {
public:
	void PubGetVal() {}
	int pub_val;
protected:
	void ProGetVal() {}
	int pro_val;
private:
	void PriGetVal() {}
	int pri_val;
};
class PubSubClass : public BaseClass {
public:
	void TestValue() {
		pub_val = 0;
		pro_val = 0;
		pri_val = 0; //ERROR // 子类无法访问基类的私有变量		
	}
	void TestFunction() {
		PubGetVal();
		ProGetVal();
		PriGetVal(); //ERROR // 子类无法访问基类的私有函数		
	}
};
class ProSubClass : protected BaseClass {
public:
	void TestValue() {
		pub_val = 0;
		pro_val = 0;
		pri_val = 0; //ERROR 
	}
	void TestFunction() {
		PubGetVal();
		ProGetVal();
		PriGetVal(); //ERROR
	}
};
class PriSubClass : private BaseClass {
public:
	void TestValue() {
		pub_val = 0;
		pro_val = 0;
		pri_val = 0; //ERROR
	}
	void TestFunction() {
		PubGetVal();
		ProGetVal();
		PriGetVal(); //ERROR
	}
};
int main()
{
	BaseClass *BC = new BaseClass();
	BC->pub_val = 0;
	BC->pro_val = 0; //ERROR // 基类的对象实例无法访问基类的保护变量
	BC->pri_val = 0; //ERROR // 基类的对象实例无法访问基类的私有变量
	BC->PubGetVal();
	BC->ProGetVal(); //ERROR // 基类的对象实例无法访问基类的保护函数
	BC->PriGetVal(); //ERROR // 基类的对象实例无法访问基类的私有函数
	//----------------------------------------------
	PubSubClass *PubSC = new PubSubClass();
	PubSC->pub_val = 0;
	PubSC->pro_val = 0; //ERROR
	PubSC->pri_val = 0; //ERROR
	PubSC->PubGetVal();
	PubSC->ProGetVal(); //ERROR
	PubSC->PriGetVal(); //ERROR
	//----------------------------------------------
	ProSubClass *ProSC = new ProSubClass();
	ProSC->pub_val = 0; //ERROR // 子类使用protected继承父类后,public变量变成protected变量
	ProSC->pro_val = 0; //ERROR
	ProSC->pri_val = 0; //ERROR
	ProSC->PubGetVal(); //ERROR // 子类使用protected继承父类后,public函数变成protected函数
	ProSC->ProGetVal(); //ERROR
	ProSC->PriGetVal(); //ERROR
	//----------------------------------------------
	PriSubClass *PriSC = new PriSubClass();
	PriSC->pub_val = 0; //ERROR // 子类使用private继承父类后,public变量变成private变量
	PriSC->pro_val = 0; //ERROR
	PriSC->pri_val = 0; //ERROR
	PriSC->PubGetVal(); //ERROR // 子类使用private继承父类后,public函数变成private函数
	PriSC->ProGetVal(); //ERROR
	PriSC->PriGetVal(); //ERROR
	//----------------------------------------------
	system("pause");
	return 0;
}

总结:

1、基类可以访问自己的public、protected、private函数以及public、protected、private变量;

2、基类的对象(Object)可以访问自己public函数以及public变量,

---- 不可以访问自己的protectedprivate函数以及protectedprivate变量;

3、派生类可以访问基类的publicprotected函数以及publicprotected变量,

---- 不可以访问基类的private函数以及private变量;


4、public继承的派生类的对象(Object)可以访问基类的public函数以及public变量,

---- 不可以访问基类的protectedprivate函数以及protectedprivate变量;

5、protected 继承的派生类的对象(Object)不可以访问基类的任何函数和变量;

6、private 继承的派生类的对象(Object)不可以访问基类的任何函数和变量;


对基类成员的访问权限publicprotectedprivate
基类YYY
基类对象(Object)YNN
派生类YYN
public 继承的派生类对象(Object)YNN
protected 继承的派生类对象(Object)NNN
private 继承的派生类对象(Object)NNN

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值