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

 

posted @ 2014-07-09 18:26  酱酱爱  阅读(1276)  评论(0编辑  收藏  举报