一、访问权限
类的内部成员变量和成员函数之间没有权限控制,都是可以互相访问的。例如:private函数可以访问public函数、protected函数可以访问private变量等等。
类的实例变量可以访问public类型、但不能访问protected和private类型成员变量/函数。
类的友元函数、友元类可以访问protected和private类型成员变量/函数。
二、继承权限
派生类的成员函数可以访问基类的public和protected成员变量/函数(不管是哪种继承类型)。
public派生类的实例变量只能访问基类的public成员变量/函数,其他两种继承类型不能访问基类。
#include <iostream>
#include <string>
using namespace std;
class Access
{
friend class Fri;
friend void fri_func();
public:
int pub;
void pub_func() {cout << "pub_func() : " << pub << endl;}
protected:
int pro;
void pro_func() {cout << "pro_func() : " << pro << endl;}
private:
int pri;
void pri_func() {cout << "pri_func() : " << pri << endl;}
};
class Fri
{
public:
Fri()
{
cout << "Fri()" << endl;
Access acs;
acs.pub = 1;
acs.pro = 2;
acs.pri = 3;
acs.pub_func();
acs.pro_func();
acs.pri_func();
}
~Fri()
{
}
};
void fri_func()
{
cout << "fri_func()" << endl;
Access acs;
acs.pub = 1;
acs.pro = 2;
acs.pri = 3;
acs.pub_func();
acs.pro_func();
acs.pri_func();
acs.pro_pub_func();
acs.pro_pri_func();
acs.pro_pub();
acs.pro_pri();
acs.pri_pub_func();
acs.pri_pro_func();
acs.pri_pub();
acs.pri_pro();
}
int main()
{
Access acs;
acs.pub = 1;
// acs.pro = 2; // 编译失败
// acs.pri = 3; // 编译失败
cout << "--- call pub_func() ---" << endl;
acs.pub_func();
// acs.pro_func(); // 编译失败
// acs.pri_func(); // 编译失败
cout << "--- call fri_func() ---" << endl;
fri_func();
cout << "--- call Fri ---" << endl;
Fri fri;
return 0;
}