C++中派生与继承的基本知识: #include<iostream> #include<string> using namespace std; class Item_base{//没有任何打折策略的基类 public: Item_base(const string &book="",double sales_price=0.0): isbn(book),price(sales_price){} string book() const { return isbn; } virtual double net_price(size_t n) const { return n*price; } //继承层次的根类总是应该定义一个虚析构函数,析构函数的虚函数性将被派生类继承 virtual ~Item_base(){} private: string isbn; protected: double price;//protected成员可以被派生类对象访问但不能被该类型的普通用户访问 }; class Disc_item:public Item_base{//抽象类,用于派生各种打折策略,此类型的对象无实际意义 public: //通过构造函数初始化列表为类的基类和成员提供初始值,首先初始化基类然后根据声明次序初始化派生类的成员 Disc_item(const string &book="",double sales_price=0.0,size_t qty=0,double disc_rate=0.0): Item_base(book,sales_price),quantity(qty),discount(disc_rate){} //此类将net_price(size_t)const定义为纯虚函数,不允许用户创建Disc_item类型的对象 double net_price(size_t) const=0; protected: size_t quantity; double discount; }; class Bulk_item:public Disc_item{//此类实行超出一定数量全部打折策略 public: //一个类只能初始化自己的直接基类 Bulk_item(const string &book="",double sales_price=0.0,size_t qty=0,double disc_rate=0.0): Disc_item(book,sales_price,qty,disc_rate){/*在构造函数体里进行基类成员的赋值不是个好主意*/} //重新定义自己的net_price(size_t)const版本以实行自己打折策略 double net_price(size_t) const; }; class Over_item:public Disc_item{//此类实行超出一定数量超出部分打折策略 public: Over_item(const string &book="",double sales_price=0.0,size_t qty=0,double disc_rate=0.0): Disc_item(book,sales_price,qty,disc_rate){} double net_price(size_t) const; }; double Bulk_item::net_price(size_t cnt) const { if(cnt>=quantity) return cnt*(1-discount)*price; else return cnt*price; } double Over_item::net_price(size_t cnt) const { if(cnt>quantity) return (cnt-quantity)*(1-discount)*price+quantity*price; else return cnt*price; } void print_total(ostream &os,const Item_base &item,size_t n) { os<<"ISBN: "<<item.book()<<"/tnumber sold: "<<n <<"/ttotal price: "<<item.net_price(n)<<endl; } int main() { Item_base item("item-1",3.5);//没有任何打折策略的销售 // Disc_item disc("disc-1",3.5,10,.5);//ERROR:pure virtual function was not defined Bulk_item bulk("bulk-1",3.5,20,.2);//超过20本实行全部8折策略 Over_item over("over-1",3.5,20,.2);//超过20本实行超出部分8折策略 print_total(cout,item,25); // print_total(cout,disc,25); print_total(cout,bulk,25); print_total(cout,over,25); return 0; }