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();
}

 

posted @ 2017-01-04 11:17  琴鸟  阅读(207)  评论(0编辑  收藏  举报