# include <iostream> # include <vector> using  namespace  std; 
class  Quote { 
    public : 
    Quote ( )  =  default ; 
    Quote ( const  std:: string & book,  double  sales_price) :  bookNo ( book) ,  price ( sales_price)  { } 
    std:: string isbn ( )  const  {  return  bookNo;  } 
    
    virtual  double  net_price ( std:: size_t n)  const  {  return  n *  price;  } 
    virtual  ~ Quote ( )  =  default ; 
    private : 
    std:: string bookNo; 
    
    protected : 
    double  price =  0.0 ; 
} ; 
class  Disc_quote :  public  Quote { 
    public : 
    Disc_quote ( )  =  default ; 
    Disc_quote ( const  std:: string & book,  double  price,  std:: size_t qty,  double  disc) :  Quote ( book,  price) ,  quantity ( qty) ,  discount ( disc)  { } 
    double  net_price ( std:: size_t)  const  =  0 ; 
    protected : 
    std:: size_t quantity =  0 ; 
    double  discount =  0.0 ; 
} ; 
class  Bulk_quote :  public  Disc_quote { 
    public : 
    Bulk_quote ( )  =  default ; 
    Bulk_quote ( const  std:: string&  book,  double  price,  std:: size_t qty,  double  disc) :  Disc_quote ( book,  price,  qty,  disc)  { } 
    double  net_price ( std:: size_t)  const  override ; 
} ; 
double  Bulk_quote :: net_price ( size_t cnt)  const { 
    if  ( cnt >=  quantity) { 
        return  cnt *  ( 1  -  discount)  *  price; 
    } 
    else { 
        return  cnt *  price; 
    } 
} 
double  print_total ( ostream & os,  const  Quote & item,  size_t n) { 
    double  ret =  item. net_price ( n) ; 
    os<< "ISBN: " << item. isbn ( ) << " # sold: " << n<< " total due: " << ret<< endl; 
    return  ret; 
} 
int  main ( ) { 
    vector< Quote>  basket =  { Bulk_quote ( "0-101-13456-X" ,  10 ,  10 ,  0.5 ) ,  Bulk_quote ( "0-102-34567-Y" ,  15 ,  20 ,  0.5 ) ,  Bulk_quote ( "0-103-32467-X" ,  5 ,  30 ,  0.5 ) } ; 
    double  total_price =  0.0 ; 
    for ( const  auto  & b :  basket) { 
        total_price +=  b. net_price ( 15 ) ; 
    } 
    cout<< total_price<< endl; 
    return  0 ; 
}