什么是访问控制
C++标准中定义了三种类成员访问控制符,公有的public
,保护的protected
,私有的private
,这是在类的内部声明这三种控制符的意思
为什么需要访问控制
访问控制就是C++提供的一种用来保护类里的方法和属性的手端(保护即对谁可以调用某个方法和访问某个属性加上一个限制 如果某个对象试图调用一个它无权进行访问的函数 编译器将报错)
控制符访问特点
public成员:能被 本类的成员函数 (此类中任何类型的控制符声明的成员函数都可以访问)、友元函数、本类的对象、其派生类的成员函数 (不管是哪一种控制符声明的成员函数,都可以访问此类的public成员)
protected成员:能被 本类的成员函数(此类中任何类型的控制符声明的成员函数都可以)、 友元函数、其派生类的成员函数(不管是哪一种控制符声明的成员函数,都可以)与public成员相比 本类的对象及派生类的对象都不得访问此类protected成员
private成员:能被 本类的成员函数 (不管是哪一种控制符声明的成员函数,都可以)、友元函数访问 。 与public和protected成员相比 本类及派生类的对象 派生类的成员函数 均不可访问此类 private成员
总结:
public成员 允许类对象对public属性的类成员进行访问
protected访问属性下的类成员虽然 允许类成员函数对类成员进行访问 但是 不允许类对象及其派生类对象对其进行访问
private访问属性下的类成员只 允许本类中的成员函数对类成员进行访问 不允许本类对象,派生类对象,派生类成员函数对其进行访问
注意
1.对类的用户而言(即使用类对象实例的人 还有一种说法就是指只能看到类的头文件的人,因为设计类的人都将他写的实现文件编译成了二进制文件(在Windows下是.lib
,.obj
后缀的文件)通过类对象的实例 只能访问到类的public访问类型成员(成员函数或变量)
2.对类本身而言,即类的设计者,在设计类的过程中,在设计类的过程中,可以通过类的所有的成员函数(任何类型的控制符声明)或者友元函数 访问其类内部的所有访问类型的成员(函数和变量)
3.对该类的派生类而言,基类的public、protected的成员对它来说是可见的,即可以访问 ,至于派生类如何对基类的三种访问类型的成员进行访问,涉及了C++类继承的知识 接下来会进行解释
继承机制下的类成员访问控制
在继承机制中,会涉及到两层访问控制符,一层在子类派生列表中,一层在基类中(派生类的内存模型分为两部分 :基类部分和派生类部分,其中基类部分是从基类继承而来的,派生类是自己定义的)
子类派生列表中的访问控制符:
上述子类派生列表中的访问控制符 影响的是派生类中继承自基类的基类部分成员 (函数或变量)的访问控制权限(也仅仅只有这一点影响),具体的影响为:
public继承(保持不变):派生类中继承自基类部分的成员(函数或变量)的访问控制权限和其在基类中声明的权限一样(public继承后,子类可以访问父类的public,protected成员,子类的客户(即子类外部)还是保持原有的访问权限)
protected继承(各自降低一个权限):派生类继承自基类中的public成员在派生类中变成protected权限,基类中其他成员经继承后再派生类中都变为private权限( protected继承后,子类仍可以访问父类的public,protected成员,子类的客户就不能访问这些成员了)
private继承(全部变为private成员):派生类继承自基类部分的成员(函数或变量)经继承后在派生类中的访问控制权限全部变为private成员(private继承后,子类仍可以访问父类的public,protected成员,子类的客户也不能访问这些成员了)
注意:🎯
1.不管是什么继承方式,基类的private成员其派生类都是不可以直接访问的(派生类可通过其他接口间接访问)
2.无论控制权限如何,继承方式如何