• 关于C++访问控制的理解


    很久以前写的一篇文章,因为另一篇博客太老了,所以转过来,不想去查那篇博客了。

     

     

    private, public, protected 访问标号的访问范围。private:   访问范围:1.该类的成员函数。2.其友元函数访问。不能被任何其他访问,该类的对象也不能访问。
    protected:访问范围:1.该类的成员函数。2.派生类中的函数(包括派生类友元函数)。3.其友元函数访问。但不能被该类的对象访问。
    public:    访问范围:1.该类的成员函数。2.派生类中的函数(包括派生类友元函数)。3.其友元函数访问。4.该类的对象访问。 友元函数包括3种:设为友元的普通的非成员函数;设为友元的其他类的成员函数;设为友元类中的所有成员函数。

    第二:类的继承后方法属性变化。private 属性不能够被继承。private属性在子类中不可见。pravite 只对本类可见
    protected 对本类和继承类可见
    使用private继承,父类的protected和public属性在子类中变为private;
    使用protected继承,父类的protected和public属性在子类中变为protected;
    使用public继承,父类中的protected和public属性不发生改变;  如下所示:                                 

                              public:            protected:       private:
    public继承             public             protected        不可用 
    protected继承       protected        protected        不可用 
    private继承            private           private            不可用 
    protected继承和private继承能降低访问权限。

    值得提出的是:在C++primer中存在这样一句话 :“派生类只能通过派生类对象访问其基类的protected成员,派生类对基类类型对象的protected成员没有访问权限。”(详见 C++primer 第四版特别版475页 )这句话是错的,派生类对象无法访问基类的protected成员,

    派生类对基类的protected成员可以访问,派生类无法通过其基类类型对象来调用基类的protected成员。

    一句话:继承的时候,无论用什么方式(public.protected.private),子类随时都可以访问父类的非private变量或函数。

    我想总结出三点:大家记住有帮助:

    1  对象只可以访问最终的(继承标号作用后)public成员。 例如public经过public继承 那么它可以是类的对象可访问,当然也可类访问。

    2 类的private成员在子类中不可访问,实际上他根本就没有被继承。

    3 类的protected成员只可以被类或子类访问,不可以被对象访问。

    protected专门就是为继承(子类)设计的,用public继承 那么基类所有的访问标识在子类不变 。

    下面是验证我说的那个断定“派生类对象无法访问基类的protected成员,派生类对基类的protected成员可以访问,派生类无法通过其基类类型对象来调用基类的protected成员。”

    程序代码:

    #include "stdafx.h"
    #include "iostream"
    using namespace std;

    class base{
    public:
     base(int value=0):base_i(value){}
     void base_pub(){cout<<"base_pub have been used !"<<endl;}
    protected:
     void base_pro(){cout<<"base_pro have been used !"<<endl;}
    private:
     int base_i;
    };

    class derived:public base{
    public:
      derived(int data=0):derived_i(data){}
     void derived_pub(){cout<<"derived_pub have been used: "<<endl;base_pro();derived_pro();}
    protected:
     void derived_pro(){cout<<"derived_pro have been used;"<<endl;}
    private:
     int derived_i;

    };


    int _tmain(int argc, _TCHAR* argv[])
    {
     base b(1000);
     derived d(999);
     //b.base_pub();
     d.base_pro();
     d.derived_pub();
     //d.derived_pro();
     return 0;
    }

    编译结果:

    1>    d:\我的文档\visual studio 2008\projects\visitorcontrol\visitorcontrol\visitorcontrol.cpp(10) : 参见“base”的声明
    1>d:\我的文档\visual studio 2008\projects\visitorcontrol\visitorcontrol\visitorcontrol.cpp(39) : error C2248: “base::base_pro”: 无法访问 protected 成员(在“base”类中声明)
    1>     d:\我的文档\visual studio 2008\projects\visitorcontrol\visitorcontrol\visitorcontrol.cpp(15) : 参见“base::base_pro”的声明
    1>     d:\我的文档\visual studio 2008\projects\visitorcontrol\visitorcontrol\visitorcontrol.cpp(10) : 参见“base”的声明

    当然程序改动正确的结果是:

    #include "stdafx.h"
    #include "iostream"
    using namespace std;

    class base{
    public:
     base(int value=0):base_i(value){}
     void base_pub(){cout<<"base_pub have been used !"<<endl;}
    protected:
     void base_pro(){cout<<"base_pro have been used !"<<endl;}
    private:
     int base_i;
    };

    class derived:public base{
    public:
     
     derived(int data=0):derived_i(data){}
     void derived_pub(){cout<<"derived_pub have been used: "<<endl;base_pro();derived_pro();}
    protected:
     void derived_pro(){cout<<"derived_pro have been used;"<<endl;}
    private:
     int derived_i;

    };


    int _tmain(int argc, _TCHAR* argv[])
    {
     base b(1000);
     derived d(999);
     //b.base_pub();
     //d.base_pro();
     d.derived_pub();
     //d.derived_pro();
     return 0;
    }

    程序截图:

    这个小程序 大家可以随便修改测试,基本可以做个演示实验的小程序。

    好了,还有那些地方不明白就修改程序的哪些地方,看看实践的结果和我这些讲解是不是一样吧。如果有错,你一定要告诉我哦。 谢谢大家。

  • 相关阅读:
    JavaScript Validator 报错
    JSP项目_Web路径_磁盘物理路径
    TreaponseHeader
    TrequestHeader
    HTML学习笔记1
    SQL文摘:DATE_TRUNC: A SQL Timestamp Function You Can Count On
    SQL文摘:Writing Subqueries in SQL
    Python文摘:Requests (Adavanced Usage)
    Python文摘:Requests
    Python文摘:More About Unicode in Python 2 and 3
  • 原文地址:https://www.cnblogs.com/cslave/p/2586645.html
Copyright © 2020-2023  润新知