private, public, protected 访问标号的访问范围。

  |   0 评论   |   1,169 浏览

    第一:private, public, protected 访问标号的访问范围。

    private只能由1.该类中的函数、2.其友元函数访问。不能被任何其他访问,该类的对象也不能访问。

    protected可以被1.该类中的函数、2.子类的函数、以及3.其友元函数访问。但不能被该类的对象访问。

    public可以被1.该类中的函数、2.子类的函数、3.其友元函数访问,也可以由4.该类的对象访问。

    注:友元函数包括3种:设为友元的普通的非成员函数;设为友元的其他类的成员函数;设为友元类中的所有成员函数。

    第二:类的继承后方法属性变化。

    private 属性不能够被继承。
    使用private继承,父类的protectedpublic属性在子类中变为private

    使用protected继承,父类的protectedpublic属性在子类中变为protected

    使用public继承,父类中的protectedpublic属性不发生改变

     如下所示:               public:             protected:       private:

    public继承             public               protected        不可用 

    protected继承       protected        protected        不可用 

    private继承            private             private            不可用 

    protected继承和private继承能降低访问权限。

    publicprotectedprivate继承

    在C++中继承主要有三种关系:public、protected和private。这三种继承关系中public继承是最为常用的一种继承关系,private继承是最少见的继承关系。

    1. public

    public继承是一种接口继承,根据面向对象中的关系而言就是,派生类可以代替基类完成基类接口所声明的行为.

    从语法角度上来说,public继承会保留基类中成员(包括函数和变量等)的可见性不变,也就是说,基类的public成员为派生类的public成员,基类的protected成员为派生类的protected成员。

    2. protected

    从语义角度上来说,protected继承是一种实现继承

    从语法角度上来说,protected继承会将基类中的public可见性的成员修改成为protected可见性,相当于在派生类中引入了protected成员,这样一来在派生类中同样还是可以调用基类的protected和public成员,派生类的派生类就也可以调用被protected继承的基类的protected和public成员。

    例如:

    class CSample1 {

    protected:

        void printProtected() {}

    public:

    void printPublic() {}

    };

    class CSample2 : protected CSample1 {};

    class CSample3 : public CSample2 {

       void print3() {

          printProtected();

          printPublic();

    }

    };

    3. private

    从语义角度上来说,private继承是一种实现继承,private继承会将基类中的publicprotected可见性的成员修改成为private可见性,这样一来虽然派生类中同样还是可以调用基类的protectedpublic成员,但是在派生类的派生类就不可以再调用被private继承的基类的成员了。

    class CSample1 {
    protected:
      void printProtected() {}
    public:
      void printPublic() {}
    };
    class CSample2 : private CSample1 {};
    class CSample3 : public CSample2 {
      void print3() {
        printProtected(); // 编译错误,不可以调用该函数
        printPublic();    // 编译错误,不可以调用该函数
      }
    };

    4. using声明

    如果进行private或protected继承,则基类成员的访问级别在派生类中比在基类中更受限:

    class Base{

    public:

        std::size_t size() const {return n;}

    protected:

        std::size_t n;

    }

    class Derived : private Base{…};

    在这一继承层次中,size在Base中为public,但在Derived中为private。为了使size在Derived中成为public,可以在Derived的public部分增加一个using声明。如下这样改变Derived的定义,可以使size成员能够被用户访问,并使n能够被从Derived派生的类访问:

    class Derived : private Base{

    public:

        using Base::size;

    privated:

        using Base::n;

        //…

    }

     

    评论

    发表评论

    validate