面向对象的基础,也是关键标志,public、private体现出了封装特性,public可以对外暴露使用,但是private则恰恰相反,只供本类内调用(当然friend除外,传送门:
C++友元介绍
)。proteced体现出了继承,无论子类是哪种继承方式,均可以在子类中调用基类的protected成员。
罗列一下不同修饰词下的成员在不同继承方式下的访问属性:
public继承 | protected继承 | private继承 | |
---|---|---|---|
public成员 | public | protected | private |
protected成员 | protected | protected | private |
private成员 | private | private | private |
我们可以按照优先级拍个序:public > protected > private,当遇到遇到大于等于当前自己等级的继承方式时,保持现有访问等级,当遇到小于当前自己等级的继承方式时,访问属性降到当前继承方式的等级,这样就不需要死记硬背下整个继承访问的关系了,只需要拿继承等级与当前的修饰等级比较,高了不变,低了就降低,方便很多。
protected成员无论在哪种继承方式下,其均可被派生类访问,private成员无论在哪种继承方式下均不可被派生类访问。
创建一个Car的基类,Car成员为public,Driver为protected,Engine为private,这样也好理解,正常的情况下,整个车肯定是外部可见的吧,驾驶员也许可以也许不可以,引擎肯定不可见。
#include<iostream>
using namespace std;
class BaseObject
{
public:
BaseObject(): Car(1),Driver(2),Engine(3){};
~BaseObject() {};
public:
int Car;
protected:
int Driver;
private:
int Engine;
};
class Audi : public BaseObject
{
public:
void func() {
cout << Car << endl; //OK, Car的访问属性为public
cout << Driver << endl;//ok, Driver的访问属性为protected
cout << Engine << endl;//error,Engine为基类的private成员,派生类不可访问
}
};
class BMW : protected BaseObject
{
public:
void func() {
cout << Car << endl; //OK, Car的访问属性为protected
cout << Driver << endl;//ok, Driver的访问属性为protected
cout << Engine << endl;//error,Engine为基类的private成员,派生类不可访问
}
};
class Benz : private BaseObject
{
public:
void func() {
cout << Car << endl; //OK, Car的访问属性为private
cout << Driver << endl;//ok, Driver的访问属性为private
cout << Engine << endl;//error,Engine为基类的private成员,派生类不可访问
}
};
int main()
{
Audi Car1;
BMW Car2;
Benz Car3;
cout << Car1.Car << endl;//ok,public成员可以被类外调用
cout << Car1.Driver << endl;//error, protected成员不可被类外调用
cout << Car1.Engine << endl;//error, private成员不可被派生类以及类外调用
cout << Car2.Car << endl;//error,protected成员可以被类外调用
cout << Car2.Driver << endl;//error, protected成员不可被类外调用
cout << Car2.Engine << endl;//error, private成员不可被派生类以及类外调用
cout << Car3.Car << endl;//error,private成员可以被类外调用
cout << Car3.Driver << endl;//error, private成员不可被类外调用
cout << Car3.Engine << endl;//error, private成员不可被派生类以及类外调用
return 0;
}
版权声明:本文为qq_39974998原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。