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变量,
---- 不可以访问自己的protected、private函数以及protected、private变量;
3、派生类可以访问基类的public、protected函数以及public、protected变量,
---- 不可以访问基类的private函数以及private变量;
4、public继承的派生类的对象(Object)可以访问基类的public函数以及public变量,
---- 不可以访问基类的protected、private函数以及protected、private变量;
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 |