zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    玩转web之javaScript(五)---js和jquery一些不可不知的方法(input篇)
    设计模式 外观模式 一键电影模式
    设计模式 适配器模式 以手机充电器为例
    高仿微信5.2.1主界面架构 包含消息通知
    Java进阶 创建和销毁对象
    sql语句中单引号嵌套问题
    Spark SQL UDF和UDAF示例
    Spark Parquet使用
    iptables只允许指定ip访问本机的指定端口
    Spark On YARN内存和CPU分配
  • 原文地址:https://www.cnblogs.com/zhidao-chen/p/3834155.html
Copyright © 2011-2022 走看看