C++ class修饰符public、private、protected

  • Post author:
  • Post category:其他


面向对象的基础,也是关键标志,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 版权协议,转载请附上原文出处链接和本声明。