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)不可以访问基类的任何函数和变量;


对基类成员的访问权限 public protected private
基类 Y Y Y
基类对象(Object) Y N N
派生类 Y Y N
public 继承的派生类对象(Object) Y N N
protected 继承的派生类对象(Object) N N N
private 继承的派生类对象(Object) N N N

 

 

你可能感兴趣的:(C++)