参考资料:《C++ Primer习题集(第5版)》
目的:练习虚函数的构造。
Quote: 基类,提供基本的购书规则。
Bulk_quote: 派生类,提供不同的购书规则。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
class Quote {
public:
Quote() = default;//默认构造函数;
Quote(const string &book, double sales_price) : bookNo(book), price(sales_price) {}//初始化构造器;
string isbn() const {
return bookNo;//返回书籍的ISBN号;//只是返回, 可以加const;
}
virtual double net_price(size_t n) const {
return n * price;//返回给定数量的书籍的销售总额, 派生类改写并使用不同的折扣计算方法;
}
virtual void debug() {//测试;
cout << "bookNo = " << bookNo << " price = " << price << endl;
}
~Quote() = default;//对析构函数进行动态绑定;
//作为基类使用的类应该具有虚析构函数, 以保证在删除指向动态分配对象的基类指针时, 根据指针实际指向的对象所属的类型运行适当的析构函数;
private:
string bookNo;//书籍的ISBN编号;
protected:
double price = 0.0;//代表普通状态下不打折的价格;
};
class Bulk_quote : public Quote {
public:
Bulk_quote(const string &book = "", double sales_price = 0, size_t qty = 0, double disc_rate = 0) ://默认参数;
Quote(book, sales_price), min_qty(qty), discount(disc_rate) {}//使用基类构造函数初始化派生类继承基类的成员变量;
double net_price(size_t cnt) const override {//显示声明继承;
if (cnt >= min_qty) {
return cnt * (1 - discount) * price;
}
else return cnt * price;
}
void debug() override {
Quote::debug();//bookNo变量为private, 所以不能直接访问bookNo, 只能调用基类的debug()函数来显示;
cout << "min_qty = " << min_qty << " discount = " << discount << endl;
}
private:
size_t min_qty;//最少折扣所需数量;
double discount;//折扣;
};
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
Bulk_quote b("1111-999-90-99-9", 20.0, 12, 0.2);
Quote *p = &b;//动态绑定;
p -> debug();
int cnt = 20;//购买20本书;
double costs = p -> net_price(cnt);//所花费的数目;
cout << costs << endl;
return 0;
}
/*
bookNo = 1111-999-90-99-9 price = 20
min_qty = 12 discount = 0.2
320
*/