zoukankan      html  css  js  c++  java
  • 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_INCLUDED
    
    Item_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;
    }
    


  • 相关阅读:
    [转]C#程序无法在64位系统上运行之.NET编译的目标平台
    STM32是否可以跑linux
    [转]C/C++ 实现文件透明加解密
    逻辑运算
    STM32F1和STM32F4 区别
    【转】STM32定时器输出比较模式中的疑惑
    Linux rabbitmq的安装和安装amqp的php插件
    跨境电商常用的物流方式
    linux 木马清理过程
    minerd
  • 原文地址:https://www.cnblogs.com/yeta/p/2819759.html
Copyright © 2011-2022 走看看