关于protected成员

来源:互联网 发布:万能的淘宝 编辑:程序博客网 时间:2024/05/16 09:05

protected是介于private和public之间的一种访问权限:

* 像private成员一样,protected成员不能被类的用户访问;

* 像public成员一样,protected成员可被该类的派生类访问。

* 派生类只能通过派生类对象访问其基类的protected成员,派生类对其基类类型对象的protected成员没有特殊的访问权限。

例如,假定Bulk_item定义了一个成员函数,接受一个Bulk_item对象的引用和一个Item_base对象的引用,该函数可以访问自己对象的protected成员以及Bulk_item形参的protected成员,但是,他不能访问Item_base形参的protected成员。


class Item_base{public:    Item_base(const string &book="", double sales_price=0.0): isbn(book), price(sales_price){}    string book() const { return isbn;}    virtual double net_price(size_t n) const { return n*price; }    virtual ~Item_base(){}private:    string isbn;protected:    double price;    };class Bulk_item: public Item_base{public:    double net_price(size_t) const;    void memfcn(const Bulk_item &d, const Item_base &b);private:    size_t min_qty;   // minimum purchase for discount to apply    double discount;  // fractional discount to apply};void Bulk_item::memfcn(const Bulk_item &d, const Item_base &b){    // attempt to use protected member    double ret = price;  // ok: use this->price    ret = d.price;   // ok: use price from a Bulk_item    ret = b.price;  // error: no access to price from Item_base }
d.price的使用正确,因为是通过Bulk_item 类型对象引用price,b.price的使用非法,因为对Item_base类型的对象没有特殊访问权限。

如果没有继承,类只有两种用户:类本身的成员和该类的用户。将类划分为private和public访问级别反映了用户种类的这一分隔:用户只能访问public接口,类成员和友元既可以访问public成员也可以访问private成员。有了继承,就有了类的第三种用户:从类派生定义新类的程序员。派生类的提供者通常(但并不总是)需要访问(一般为private的)基类实现,为了允许这种访问而仍然禁止对实现的一般访问,提供了附加的protected访问标号。类的protected部分仍然不能被一般程序访问,但可以被派生类访问。只有类本身和友元可以访问基类的private部分,派生类不能访问基类的private成员。

定义类充当基类时,将成员设计为public的标准并没有变:仍然是接口函数应该为public,而数据一般不应为public。被继承的类必须决定实现的哪些部分声明为protected,哪些部分声明为private。提供给派生类型的接口是protected成员和public成员的组合。



1 0