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

面向对象的基础,也是关键标志,public、private体现出了封装特性,public可以对外暴露使用,但是private则恰恰相反,只供本类内调用(当然friend除外,传送门:C++友元介绍)。proteced体现出了继承,无论子类是哪种继承方式,均可以在子类中调用基类的protected成员。
罗列一下不同修饰词下的成员在不同继承方式下的访问属性:

public继承protected继承private继承
public成员publicprotectedprivate
protected成员protectedprotectedprivate
private成员privateprivateprivate

我们可以按照优先级拍个序: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bussy-Lake

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值