C++primer 练习15.15

// 15_15.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;

class Quote
{
public:
    Quote() = default;
    Quote(const string &book,double p):bookNo(book),price(p){}
    const string& isbn()const { return bookNo; }
    virtual double net_price(size_t n)const
    {
        return n*price;
    }
private:
    string bookNo;
protected:
    double price = 0.0;
};

class Dis_Quote :public Quote
{
public:
    Dis_Quote() = default;
    Dis_Quote(const string &book,double p,size_t n,double d):Quote(book,p),quantity(n),discount(d){}
    virtual double net_price(size_t n)const = 0;
protected:
    size_t quantity = 0;
    double discount = 0.0;
};

class Bulk_Quote :public Dis_Quote
{
public:
    Bulk_Quote() = default;
    Bulk_Quote(const string &book,double p,size_t n,double d):Dis_Quote(book,p,n,d){}
    virtual double net_price(size_t n)const override
    {
        if (n > quantity)
            return n*(1 - discount)*price;
        else
            return n*price;
    }
};

class Exercise_Quote :public Dis_Quote
{
public:
    Exercise_Quote() = default;
    Exercise_Quote(const string &book,double p,size_t n,double d):Dis_Quote(book,p,n,d){}
    virtual double net_price(size_t n)const override
    {
        if (n <= quantity)
            return n*(1 - discount)*price;
        else
            return quantity*(1 - discount)*price + (n - quantity)*price;
    }
};

double print_total(ostream &os, const Quote &item, size_t n)
{
    double ret = item.net_price(n);
    os << "ISBN: " << item.isbn() <<
        " # sold: " << n << " total due: " << ret << endl;
    return ret;
}

int main()
{
    Quote q1("lidandan", 5);
    Bulk_Quote q2("lidandan", 5, 9, 0.1);
    Exercise_Quote q3("lidandan", 5, 9, 0.1);
    //Dis_Quote q4;
    print_total(cout, q1, 10);
    print_total(cout, q2, 10);
    print_total(cout, q3, 10);
    return 0;
}
时间: 2024-10-22 09:03:10

C++primer 练习15.15的相关文章

C++ Primer Plus 第15章 友元、异常和其他

第15章 友元.异常和其他 1.友元不仅有友元函数,还能是友元类 还可以将类中的某一个成员函数指定为另一个类的友元 尽管友元被授予从外部访问私有部门的权限,单并不与面向对象编程思想相愽,相反,它们提高了公有接口的灵活性 2.类的成员函数作为其他类的友元,涉及到类的声明顺序. 还有一个函数作为两个类的友元 这方面内容看P607-611 3.嵌套类:在另一个类中声明的类被称为嵌套类 类嵌套与包含不一样.包含意味着将一个类对象作为另一个类的成员,而对类进行嵌套不创建类成员,而是定义了一种类型. 4.对

《C++ Primer》 chapter 15 TextQuery

<C++ Primer>中第15章为了讲解面向对象编程,举了一个例子:设计一个小程序,能够处理查询给定word在文件中所在行的任务,并且能够处理“非”查询,“或”查询,“与”查询.例如执行查询 one & of |the ,表示对单词one和of的查询结果取交集,然后对单词the的查询结果取并集. 书中查询的底层操作实际定义在类TextQuery中,我们在TextQuery的基础上,进一步封装并实现如下图所示的类结构,能够达到上述功能需求.类之间的结构如下图所示: 程序扼要设计如下表所

【读书笔记】C Primer Plus ch.15位运算 示例程序15.3 定义并使用字段

通常,把位字段作为一种更紧凑储存数据的方式. 程序清单 15.3 fields.c 1 #include <stdio.h> 2 #include <stdbool.h> 3 // 线的样式 4 #define SOLID 0 // 实线 5 #define DOTTED 1 // 点线 6 #define DASHED 2 // 虚线 7 // 三原色 8 #define BLUE 4 9 #define GREEN 2 10 #define RED 1 11 // 混合色 12

C++ Primer 习题11.15分析

题目: 算法标准库定义了一个名为unique_copy的函数,其操作与unique类似,唯一的区别在于:前者接受第三个迭代器实参,用于指定复制不重复元素的目标序列.编写程序,使用unique_copy将一个list对象中不重复的元素复制到一个空的vector容器中. 原有答案如下: #include <iostream> #include <iterator> #include <vector> #include <algorithm> #include &

《C++ Primer Plus》15.5 类型转换运算符 学习笔记

C++相对C更严格地限制允许的类型转换,并添加4个类型转换运算符,是转换过程更规范:* dynamic_cast:* const_cast:* static_cast:* reinterpret_cast.[dynamic_cast运算符]假设High和Low是两个类,而ph和pl的类型分别是High*和Low*,则仅当Low是High的可访问基类(直接或间接)时,下面的语句才将一个Low*指针赋给pl:pl = dynamic_cast<Low *> ph;否则,该与据将空指针赋给pl.通常

【读书笔记】C Primer Plus ch.15位运算 示例程序15.1 整数转换成二进制字符串

正文: https://www.zybuluo.com/RayChen/note/595213

[单选题]$x = (bool)(&quot;15&quot; === 15);$x值是什么?

false true 正确答案:

C++primer 15.4节练习

练习15.15.练习15.16 1 #include <iostream> 2 #include <string> 3 #include <utility> 4 #include <memory> 5 #include <vector> 6 7 using namespace std; 8 9 class Quote { 10 public: 11 Quote() = default; 12 Quote(const string &boo

第 15 章

15.1 [出题思路] 熟悉理解虚函数.虚成员的定义. [解答] 在类中被声明为 virtual 的成员,基类希望这种成员在派生类中重定义.除了构造函数外,任意非 static 成员都可以为虚成员. 15.2 [出题思路] 区分 protected 和 private 的访问权限控制的不同之处. [解答] protected 为受保护的访问说明符.protected 成员可以被该类的成员.友元和派生类成员(非友元)访问,而不可以被该类类型的普通用户访问.而 private 成员只能被基类的成员和