zoukankan      html  css  js  c++  java
  • public protect private. 草稿。

    public protect private. 草稿。

    #include <iostream>
    #include <thread>
    #include <memory>
    
    
    //              | 父类的public成员 | 父类的protected成员 | 父类的private成员
    //---------------|------------------|---------------------|-----------------
    //public继承     | public           | protected           | 访问不到
    //---------------|------------------|---------------------|-----------------
    //protected继承  | protected        | protected           | 访问不到
    //---------------|------------------|---------------------|-----------------
    //private继承    | private          | private             | 访问不到
    
    
    using namespace std;
    
    class ibook
    {
    public:
        string signture;
        ibook(const string& _name,int _c,int _p,const string& _s):name(_name),cost(_c),price(_p),supplier(_s){}
    protected:
        string name;
        int cost;
        int price;
        string supplier;
    };
    
    class Book: public ibook
    {
    public:
    
        void showInfo()
        {
            cout<<"book name:"<<name<<". price:"<<price<<". cost:"<<cost<<". supplier:"<<supplier<<". signtrue:"<<signture<<endl;
        }
        Book(const string& _name,int _c,int _p,const string& _s):ibook(_name,_c,_p,_s){}
    
        void SetCost(int _cost,int passWord)
        {
            if(passWord==123)
            {
                //private:只有book类的函数才可以访问.这里访问主体是book::SetCost(int,int,Book* this).访问对象是this->cost.
                //虽然把setcost方法变成了public.但是我们可以利用函数的参数,要求输入密码.体现了类的封装性.
                cost=_cost;
            }
        }
    
        //可修改的参数,使用指针,不建议写成Book&,  参考google c++ 代码规范.
        void SetOtherCost(int _cost,int passWord, Book* myBook)
        {
            if(passWord==123)
            {
                //这里访问主体是Book::SetOtherCost(int,int, Book* myBook,Book* this).访问对象是*myBook和*this.
                myBook->cost=_cost;
                cost=_cost;
            }
        }
    
    
    
    };
    
    
    //根据设计规范,只推荐book 和englichbook 继承一个抽象类.
    //这里就english就强烈依赖book了.连showinfo.都没办法自定义.
    class EnglichBook:public ibook
    {
    public:
    
        void showInfo()
        {
            cout<<"book name:"<<name<<". price:"<<price<<". cost:"<<cost<<". supplier:"<<supplier<<". signtrue:"<<signture<<endl;
        }
        EnglichBook(const string& _name,int _c,int _p,const string& _s,int _tax):ibook(_name,_c,_p,_s),tax(_tax){}
    
    
    private:
        int tax;
    };
    
    
    //public:任何函数都可以访问任何此类对象的public成员.
    //private:就是说外部函数不可访问任何此类对象的私有成员.而类的内部函数可以访问任何此类对象的私有成员.
    
    
    
    int main()
    {
        Book cpp=Book("c++ primer",20,50,"bird public");
        cpp.showInfo();
        cpp.signture=string("linson's book");//public:任何函数都可以访问.这里访问主体是main().访问对象是cpp.signture
        //cpp.cost=5;//error. private:只有book类的函数才可以访问.
        cpp.showInfo();
    
        //密码错误,修改无效
        cpp.SetCost(15,33);
        cpp.showInfo();
    
        //密码ok
        cpp.SetCost(15,123);
        cpp.showInfo();
    
        Book cSharp=Book("c# good",10,20,"bird public");
    
        //可以通过一个对象来访问另外一个对象的private私有成员.为什么.我们进入函数,分析一下.
        cSharp.SetOtherCost(10,123,&cpp);
        cpp.showInfo();
        cSharp.showInfo();
    }
  • 相关阅读:
    疲劳的一天
    Singleton模式与对象池的假设....
    没有杀死我的 (创伤心理学简介)
    Python深入03 对象的属性
    协议森林14 逆袭 (CIDR与NAT)
    Python深入05 装饰器
    协议森林06 瑞士军刀 (ICMP协议)
    数据可视化的秘密
    协议森林
    协议森林13 9527 (DNS协议)
  • 原文地址:https://www.cnblogs.com/lsfv/p/6247910.html
Copyright © 2011-2022 走看看