首先解释几个特定词,下面要用到:
- 水平权限:在一个类中,成员的权限控制,就是类中的成员函数能否访问其他成员、类的对象能否访问类中某成员。
- 垂直权限:在派生类中,对从基类继承来的成员的访问。
- 内部访问:类中成员函数对其他成员的访问。
- 外部访问:通过类的对象,访问类的成员函数或者成员变量,有的书里也称之为对象访问。
C++的水平权限控制
当private,public,protected单纯的作为一个类中的成员(变量和函数)权限设置时:
类的成员函数以及友元函数可以访问类中所有成员,但是在类外通过类的对象,就只能访问该类的共有成员。
注:友元函数包括两种:设为友元的全局函数,设为友元类中的成员函数;这里将友元函数看成内部函数,方便记忆!
总结为下表:
程序验证如下:这里没有friend的成员,另外成员变量和成员函数的权限控制是一样的。
#include <iostream>
class Foo
{
public:
int a;
void public_fun();
protected:
char b;
void protected_fun();
private:
bool c;
void private_fun();
};
//验证public成员内部可见性
void Foo::public_fun()
{
a = 10;
b = 'c';
c = true;
}
//验证protected成员函数的内部可见性
void Foo::protected_fun()
{
a = 10;
b = 'c';
c = true;
}
//验证private成员函数的内部可见性
void Foo::private_fun()
{
a = 10;
b = 'c';
c = true;
}
int main()
{
Foo foo;
foo.public_fun();//验证public成员外部可见性
foo.protected_fun();//验证protected成员外部可见性,这里提示错误
foo.private_fun();//验证private成员外部可见性,这里提示错误
return 0;
}
C++的垂直访问控制
当private,public,protected作为继承方式时:
派生类可以继承基类中除了构造函数与析构函数(凡是与具体对象的类别息息相关的都不能被继承,赋值运算符重载函数也不能被继承)之外的成员,但是这些成员的访问属性在派生过程中是可以调整的。从基类继承来的成员在派生类中的访问属性是由继承方式控制的。
总结为下表:
派生类对基类成员的访问形式主要有以下两种:
- 内部访问:由派生类中新增的成员函数对基类继承来的成员的访问。
- 外部访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问。