// 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; }