参考资料:《C++Primer习题集(第5版)》
主要目的:熟悉虚函数、虚成员的定义,基类与派生类的关系。
#include <iostream>
#include <string>
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 ~Quote() = default;//对析构函数进行动态绑定;
private:
string bookNo;//书籍的ISBN编号;
protected:
double price = 0.0;//代表普通状态下不打折的价格;//派生类成员(非友元)允许访问;
};
class Bulk_quote : public Quote {//继承;
public:
Bulk_quote() = default;//首先初始化基类的部分, 然后按照声明的顺序依次初始化派生类的成员;
//如果想使用其他的基类构造函数, 我们需要以类名加圆括号内的实参列表的形式为构造函数提供初始值;
Bulk_quote(const string &book, double sales_price, size_t min_q, double zhekou) : Quote(book, sales_price), min_qty(min_q), discount(zhekou) {}
double net_price(size_t cnt) const override {//C++11;
if (cnt >= min_qty) {//购买数量超过一定量就可以打折;
return cnt * (1 - discount) * price;
}
else {
return cnt * price;
}
}
private://派生类自己独有的成员;
size_t min_qty;//适用折扣政策的最低购买量;
double discount;//折扣额;
};
double print_total(ostream &os, const Quote &item, size_t n) {//计算并打印销售给定数量的某种书籍所得的费用;
double ret = item.net_price(n);//根据传入item形参的对象类型调用;
os << "ISBN: " << item.isbn() << " # sold: " << n << " total due: " << ret << endl;
return ret;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
Quote q("90-90909-98-8", 50.0);//只有类中有能够接受常量的构造函数才能初始化成功;
Bulk_quote b("90-90909-98-8", 50.0, 10, 0.2);
double ret1 = print_total(cout, q, 12);
double ret2 = print_total(cout, b, 12);
return 0;
}
/*
ISBN: 90-90909-98-8 # sold: 12 total due: 600
ISBN: 90-90909-98-8 # sold: 12 total due: 480
*/
网友评论