• 【c++】访问控制


    1.  类内的访问控制

    1. 在基类中,public和private具有普通的含义:用户(即基类的对象)可以访问public成员(包括函数、数据),而不能访问private成员。private只能被基类的成员和友员访问。(:基类的对象无权访问private成员)
    2. 派生类对基类的public和private具有相同的含义:它可以访问public成员,不可以访问private成员。派生类对象亦如此。
    3. 为了使派生类(:是类, 不是类对象)可以基类的成员,但禁止基类的对象访问,定义了protected控制。基类protected成员,派生类可以访问,但基类以及派生类的对象是不行的。

    示例

    #include <iostream>
    #include <stdexcept>
    #include <string>
    #include <vector>
    using namespace std;
    
    class Item_base
    {
        public:
            Item_base(const string &book = "", double sales_price = 0.0) : isbn(book), price(sales_price) {};
            virtual ~Item_base() {}
        private:
            string isbn;
        protected:
            double price;
    };
    class Bulk_item : public Item_base
    {
        public:
            void print_hello() { cout << price << endl; }
    };
    
    
    int main()
    {
        Bulk_item b;
        b.print_hello();
    }

    结果

    0

    2. 派生列表的访问控制

    派生类中由两部分构成:基类的一部分+自身定义的一部分。派生类列表中访问控制,将影响基类的部分在派生类中的访问级别:

    • 如果为公有继承:派生类中的基类成员保持自己的访问级别:public还是public, private还是private,protected还是protected
    • 如果为私有继承:派生类中基类的所有成员将全部为private成员
    • 如果为受保护继承:派生类中基类的public、protected成员变为protected成员,private还是private

    总之:派生类可以进一步限制,但是不可以放松对所有继承成员的访问

    注意:私有继承类成员中仍可以访问基类的public, private成员,只是基类的部分在派生类中的性质变为:private。

    例证1

    #include <iostream>
    #include <string>
    using namespace std;
    
    class base
    {
        public:
            base(int p1=1, int p2=2, int p3=3) : pub(p1), pri(p2), pro(p3) {}
            int pub;
        private:
            int pri;
        protected:
            int pro;
    };
    
    class derived_private : protected base
    {
        public:
            void print_pri() 
            { 
                cout << "pub:" << pub << endl;
                cout << "pro:" << pro << endl;
            }
    };
    
    int main()
    {
        base b;
        derived_private d;
        d.print_pri();
    }

    结果1

    例证2

    #include <iostream>
    #include <string>
    using namespace std;
    
    class base
    {
        public:
            base(int p1=1, int p2=2, int p3=3) : pub(p1), pri(p2), pro(p3) {}
            int pub;
        private:
            int pri;
        protected:
            int pro;
    };
    
    class derived_private : private base
    {
        public:
            void print_pri() 
            { 
                cout << "pub:" << pub << endl;
                cout << "pro:" << pro << endl;
            }
    };
    
    int main()
    {
        base b;
        derived_private d;
        cout << d.pub << endl;
        cout << d.pri << endl;
        cout << d.pro << endl;
    }

    结果2

  • 相关阅读:
    【iOS
    【iOS】Swift ESTabBarController的使用
    【iOS
    【iOS】图表实现-Charts(二)
    【iOS】图表实现-Charts(一)
    【iOS】图表实现-AAChartKit
    【iOS】图表实现-总述
    【iOS
    【iOS
    整理下开发中常用的第三方库
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/3507986.html
Copyright © 2020-2023  润新知