protected访问标号的一个生僻
《c++ primer》15.2.2节中有这样一段话:
派生类只能通过派生类对象访问其基类的protected成员,派生类对其基类类型对象的protected成员没有特殊权限。
例子:Item_base是Bulk_item的基类,Bulk_item定义了一个成员方法,接受一个Bulk_item对象的引用,和一个Item_base类型对象的引用,该函数可以访问自己对象的protected成员和Bulk_item形参的protected成员,但是,它没有Item_base类型形参的protected成员的访问权限。
代码验证:
Item_base.h:
#ifndef ITEM_BASE_H_INCLUDED #define ITEM_BASE_H_INCLUDED #include <string> using std::string; class Item_base { public: Item_base(const string & sIsbn = "", double dPrice = 0.0); virtual ~Item_base(); virtual string book() const; virtual double net_price(unsigned uNumber) const; protected: double m_dPrice; private: string m_sISBN; }; #endif // ITEM_BASE_H_INCLUDEDItem_base.cpp:
#include "Item_base.h" Item_base::Item_base(const string & sIsbn, double dPrice) :m_sISBN(sIsbn), m_dPrice(dPrice) { } Item_base::~Item_base() { } string Item_base::book() const { return m_sISBN; } double Item_base::net_price(unsigned uNumber) const { return uNumber * m_dPrice; }
Bulk_item.h:
#ifndef BULK_ITEM_H_INCLUDED #define BULK_ITEM_H_INCLUDED #include "Item_base.h" class Bulk_item : public Item_base { public: Bulk_item(const string& sIsbn = "", double price = 0.0); void memfcn(const Bulk_item & d, const Item_base & b); }; #endif // BULK_ITEM_H_INCLUDED
Bulk_item.cpp:
#include "Bulk_item.h" #include <iostream> using namespace std; Bulk_item::Bulk_item(const string& sIsbn, double price) :Item_base(sIsbn, price) { } void Bulk_item::memfcn(const Bulk_item & d, const Item_base & b) { cout << "Bulk_item m_dPrice" << d.m_dPrice << endl; cout << "Item_base m_dPrice" << b.m_dPrice << endl; //这行导致编译失败,没有访问权限 cout << "m_dPrice" << m_dPrice << endl; }