首页 > 代码库 > c++ public protected private 继承

c++ public protected private 继承

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;}