1.成员访问权限
假定以下类:
class Base{ public: // construct function Base(int a = 0,int b = 0, int c = 0) : m_public(),m_protected(),m_private() {} int m_public; void public_fun() { cout << m_public << endl; } protected: int m_protected; void protected_fun() { cout << m_protected << endl; } private: int m_private; void private_fun() { cout << m_private << endl; } };
1.1.public
public为公有类型成员,其内部的变量和函数,任何情况下,在类的外部都可以直接访问。
int main() { Base b; b.m_public++; b.public_fun(); }
1.2.private
private为私有类型成员,其内部的变量和函数,任何情况下,在类的外部都不可以直接访问。
int main() { Base b; //b.m_private++; // error //b.private_fun(); // error }
1.3.protected
protected为保护类型成员,通常情况下于private类似,在类的外部都不可以直接访问。
但是被继承时,可以在派生类的函数内访问。
int main() { Base b; //b.m_protected++; // error //b.protected_fun(); // error }
2.继承访问权限
1.1.public继承
public继承后,访问基类的变量时,相当于成员类型保持不变。
在派生类内部,可以访问基类的public和protected类型的变量和函数。
在派生类外部,只能访问基类的public类型的变量和函数。
class PublicInherit : public Base { public: void Test() { m_public++; public_fun(); m_protected++; protected_fun(); //m_private++; private_fun(); //error } }; int main() { PublicInherit Public; Public.m_public++; Public.public_fun(); return 0; }
1.2.private继承
private继承后,访问基类的变量时,相当于将全部成员类型都变成private。
在派生类内部,可以访问基类的public和protected类型的变量和函数。
在派生类外部,不能访问基类的的变量和函数。
class PrivateInherit: private Base { public: void Test() { m_public++; public_fun(); m_protected++; protected_fun(); //m_private++; private_fun(); //error } }; int main() { PrivateInherit Private; //Private.m_public++; //error //Private.public_fun(); //error return 0; }
1.3.protected继承
protected继承后,访问基类的变量时,相当于将public成员类型变成protected,其他不变。
在派生类内部,可以访问基类的public和protected类型的变量和函数。
在派生类外部,不能访问基类的的变量和函数。
class ProtectedInherit : protected Base { public: void Test() { m_public++; public_fun(); m_protected++; protected_fun(); //m_private++; private_fun(); //error } }; int main() { ProtectedInherit Protected; //Protected.m_public++; //error //Protected.public_fun(); //error return 0; }
2.4.总结
继承方式 | 基类成员特性 | 派生类成员特性 | 派生类对象访问 |
public | public | public | 可以直接访问 |
public | protected | protected | 不可以直接访问 |
public | private | private | 不可以直接访问 |
protected | public | protected | 不可以直接访问 |
protected | protected | protected | 不可以直接访问 |
protected | private | private | 不可以直接访问 |
private | public | private | 不可以直接访问 |
private | protected | private | 不可以直接访问 |
private | private | private | 不可以直接访问 |
3.结构体和类的默认权限
3.1.结构体
结构体默认全部权限为public。
注:结构体也可以使用public、private、protected来强制设置访问权限。
struct Struct { int m_member; void func() { cout << m_member << endl; } }; int main() { Struct s; s.m_member++; s.func(); return 0; }
3.2.类
类默认全部权限为private。
class Class { int m_member; void func() { cout << m_member << endl; } }; int main() { Class c; //c.m_member++; //error //c.func(); //error return 0; }