1:访问控制
1.1 public 这类型成员可以被类本身函数访问,也可以被外部创建的类对象调用。子类对象与子类内部可以访问
1.2 protected类型成员,只能被类本身函数访问。外部创建的类对象没有访问权限。子类对象没有访问权限,子类内部可以访问
1.3 private类型成员,只能被类本身函数访问,外部创建的类对象没有访问权限。子类对象和子类内部都没有访问权限
class TestObject{ public: void Function(); void TestPublic(); protected: void TestProtected(); private: void TestPrivate(); }; void TestObject::Function(){ TestPublic(); TestProtected(); TestPrivate(); } int main(){ TestObject obj; obj.TestPublic();//yes obj.TestProtected();//error obj.TestPrivate();//error }
2:继承关系的访问控制
2.1 public继承。public继承使子类顺延父类的访问控制属性,即成员保持父类的控制属性,这样在子类中的成员访问控制同父类的一样
class Base { public: Base(void); ~Base(void); void TestPublic(); protected: void TestProtected(); private: void TestPrivate(); }; void Base::TestPublic(){ cout<<"TestPublic"<<endl; } void Base::TestProtected(){ cout<<"TestProtected"<<endl; } void Base::TestPrivate(){ cout<<"TestPrivate"<<endl; } class Child : public Base { public: Child (); }; Child ::Child (){ child.TestPublic();//yes TestProtected();//yes TestPrivate();//error } int _tmain(int argc, _TCHAR* argv[]) { Child child; child.TestPublic();//yes //child.TestProtected();//error //child.TestPrivate();//error return 0; }
2.2 protected继承,将父类public和protected属性的成员属性顺延到子类来后变成protected属性。protected属性是可以提供给子类在内部访问的。
如上代码,如果改为protected继承。则内部访问保持和public继承的不变,而在外部,由于父类public属性被更改为protected的属性,则在外部创建的子类对象没有了访问权限。
class Child :protectedBase{ } Child ::Child (){ child.TestPublic();//yes TestProtected();//yes TestPrivate();//error } int _tmain(int argc, _TCHAR* argv[]) { Child child; //child.TestPublic();//error //child.TestProtected();//error //child.TestPrivate();//error return 0; }
2.3 private继承。这种继承方式中断了后续子类对当前类的父类的所有访问权限,在该种继承方式下,会将父类public和protected属性顺延成private属性。这样,几时后面子类再次继承,都没有了对当前父类的成员的访问权限。
class Child :privateBase{ } Child ::Child (){ child.TestPublic();//yes TestProtected();//yes TestPrivate();//error } class Mini :public Child{ public: Mini(); } Mini::Mini(){ TestPublic();//error TestProtected();//error TestPrivate();//error } int _tmain(int argc, _TCHAR* argv[]) { Mini mini; //mini.TestPublic();//error //mini.TestProtected();//error //mini.TestPrivate();//error return 0; }