C++ Primer(第5版) 练习 15.28
练习 15.28 定义一个存放Quote对象的vector,将Bulk_quote对象传入其中。计算vector中所有元素总的net_price。
环境:Linux Ubuntu(云服务器)
工具:vim
代码块:
# 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 ;
}
运行结果显示如下: