通过继承将基类和派生类联系在一起.新出现的知识点有虚函数,protected关键字,动态绑定.
[练习]:定义Quote类,保存书的信息.作为一个基类,后续将会定义其他派生类(保存打折书籍的信息),以及一个打印书信息的函数(通过动态绑定来判断调用那种类的函数).
class Quote
{
public:
Quote() = default;//默认构造函数
Quote(const string& s, const double Sales_price) :bookNo(s), price(Sales_price){}//构造函数
virtual double net_price(size_t n)const{ return price*n; }//虚汗函数,定义实际价格
string isbn()const{ return bookNo; }
virtual ~Quote(){}//virtual 析构函数
private:
string bookNo;
protected:
double price;
};
double print_total(ostream& os,Quote& sales, size_t n)
{
auto ret = sales.net_price(n);
os << "ISBN: " << sales.isbn() << " solds: " << n << " total due: " << ret << endl;
return ret;
}
======================================================================================
定义的派生类:从Quote处继承,包含打折信息
class Bulk_quote :public Quote//从Quote继承
{
public:
/*****************定义派生类自己的***********************/
Bulk_quote() = default;//默认构造函数
Bulk_quote(const string& s, const double Sales_price,size_t cnt, double disc) :
Quote(s,Sales_price),min_qty(cnt),discount(disc){}
double net_price(size_t) const override;//覆盖了基类的虚函数
private:
size_t min_qty;//适用折扣政策的最低购买量.
double discount;//折扣额
};
double Bulk_quote::net_price(size_t cnt) const
{
if (cnt >= min_qty)
return (1 - discount)*cnt*price;
else
return cnt*price;
}
======================================================================================
定义一个类使其享受数量受限的折扣,当购买数量超过一个给定的限量享受折扣.否则超出的部分将以原价销售.
class Limit_quote : public Quote//从派生类继承
{
public:
Limit_quote() = default;
Limit_quote(const string& s, const double Sales_price, size_t cnt, double disc):
Quote(s, Sales_price), limit_qty(cnt), discount(disc){}
/*****覆盖原来的虚函数*********/
double net_price(size_t n) const override{
return price*(n - discount * ( n > limit_qty ? limit_qty:n));
}
private:
int limit_qty;
double discount;
};
double print_total(ostream& os,const Quote& sales, size_t n)
{
auto ret = sales.net_price(n);
os << "ISBN: " << sales.isbn() << " solds: " << n << " total due: " << ret << endl;
return ret;
}
//测试部分
int main()
{
Quote x("pyb", 15);
Bulk_quote y("pyb", 15, 100, 0.3);
Limit_quote z("pyb", 15, 100, 0.5);
print_total(cout, y, 200);
print_total(cout,x, 200);
print_total(cout,z,200);
return 0;
}
===========================================
[练习]:为Quote类体系定义debug虚函数,显示自己成员.注意使用::作用符可以规避虚函数的覆盖,强制调用某个特定版本
virtual void debug()const{
cout << "ISBN: " << isbn() << " single price: " << price << endl; }//显示成员
void debug()const override{
Quote::debug();
cout <<" min_quantity: " <<min_qty<<"discount: "<<discount<<endl;
}
void debug()const override{
Quote::debug();
cout<<" Limit_quantity: "<< limit_qty << " discount: " << discount << endl;
}