Quote class保持不变
定义抽象基类Disc_quote继承自Quote,它代表一个折扣概念,由它的继承类代表不同的折扣策略。
Disc_quote.h
#pragma once
#include "Quote.h"
// 抽象基类
class Disc_quote : public Quote {
public:
Disc_quote() = default;
Disc_quote(const std::string &bookNo, double price, size_t qty, double discount);
virtual double net_price(size_t n) const = 0; //纯虚函数
virtual void debug() const;
~Disc_quote();
protected:
size_t min_qty = 0;
double discount = 0.0;
};
Disc_quote.cpp
#include "Disc_quote.h"
Disc_quote::Disc_quote(const std::string &bookNo, double price, size_t qty, double discount)
: Quote(bookNo, price), min_qty(qty), discount(discount) {}
void Disc_quote::debug() const {
std::cout << "This is Disc_quote objec call" << std::endl;
Quote::debug();
std::cout << "The min number of books is: " << min_qty << " and the discount is: " << discount << std::endl;
}
Disc_quote::~Disc_quote() {}
两个不同的折扣策略代表:
Bulk_quote代表超过一定数量就享受折扣优惠
Limited_quote代表在一定范围的数量内享受折扣,超出就按照原价
Bulk_quote.h
#pragma once
#include "Disc_quote.h"
class Bulk_quote : public Disc_quote {
public:
Bulk_quote() = default;
Bulk_quote(const std::string &bookNo, double book_price, size_t min_qty, double discount);
virtual double net_price(size_t n) const;
virtual void debug() const;
virtual ~Bulk_quote();
};
Bulk_quote.cpp
#include "Bulk_quote.h"
Bulk_quote::Bulk_quote(const std::string &bookNo, double book_price, size_t min_qty, double discount)
: Disc_quote(bookNo, book_price, min_qty, discount) {}
double Bulk_quote::net_price(size_t n) const {
if (n >= min_qty) {
return n * (1 - discount) * price;
} else {
return n * price;
}
}
void Bulk_quote::debug() const {
std::cout << "===This is a Bulk_quote object call" << std::endl;
Disc_quote::debug();
std::cout << "The min number of books is: "
<< min_qty << " and the discount is: "
<< discount << std::endl;
}
Bulk_quote::~Bulk_quote() {}
Limited_quote.h
#pragma once
#include "Disc_quote.h"
class Limited_quote : public Disc_quote {
public:
Limited_quote() = default;
Limited_quote(const std::string &bookNo, double book_price, size_t min_qty, double discount, size_t max_qty);
virtual double net_price(size_t n) const;
virtual void debug() const;
~Limited_quote();
private:
size_t max_qty;
};
Limited_quote.cpp
#include "Limited_quote.h"
Limited_quote::Limited_quote(const std::string &bookNo, double book_price, size_t min_qty, double discount, size_t max_qty)
: Disc_quote(bookNo, book_price, min_qty, discount), max_qty(max_qty) {}
double Limited_quote::net_price(size_t n) const {
if (min_qty < n && n < max_qty) {
return n * (1 - discount) * price;
} else {
return n * price;
}
}
void Limited_quote::debug() const {
std::cout << "===This is a Limited_quote object call" << std::endl;
Disc_quote::debug();
std::cout << "The max number of books is: " << max_qty << std::endl;
}
Limited_quote::~Limited_quote() {}
main.cpp
#include <iostream>
#include <string>
#include "Quote.h"
#include "Bulk_quote.h"
#include "Limited_quote.h"
using namespace std;
int main() {
Quote *b = new Limited_quote("tree", 25, 3, 0.3, 10);
b->print_total(cout, *b, 8);
b->debug();
delete b;
cout << "====================================" << endl;
b = new Bulk_quote("big", 57, 5, 0.5);
b->print_total(cout, *b, 6);
b->debug();
delete b;
}