15.1
某些函数我们希望它能与基类有不同的表现形式,就用virtual修饰成虚函数
15.2
private 基类和友元类可以访问
protect 基类和它的派生类都可以访问,但是其他的类不能访问,
两个最显著的区别就是支不支持派生类访问
15.3
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;
};
15.4
(a) ,不正确,不能某个类既是基类又是派生了你
(b), 不正确,违反了继承的本质,无法从私有的类中继承
(c),不正确,派生类的声明与普通类一样
15.5
class Bulk_quote : public Quote{
public:
Bulk_quote() = default ;
Bulk_quote(const std::string & book,double p , std::size_t qty,double disc):Quote(book,p),min_qty(qty),discount(disc){}
//覆盖基类的函数版本以实现基于大量购买的折扣策略
double net_price(std::size_t n) const override;
private:
std::size_t min_qty = 0; //适用折扣政策的最低购买量
double discount = 0.0; //以小数表示的折扣
};
double Bulk_quote::net_price(std::size_t cnt) const {
if(cnt >= min_qty)
return cnt*(1-discount) * price;
else{
return cnt * price;
}
}
15.6
//一个Quote 编号为li,单价为20
Quote q("li", 20.00);
//一个Bulk_quote,编号为li 单价20 最小折扣数量10 折扣20%
Bulk_quote bq("li", 20.00, 10, 0.2);
//计算相应数量的商品
print_total(std::cout, q, 15);
print_total(std::cout, bq, 15);
15.7
类中的方法
//新购物打折策略
double Bulk_quote::new_price(std::size_t cnt,std::size_t use_count) const {
if(cnt<=use_count){ //折扣数目内
return cnt*price*(1-discount);
}else{ //折扣数目外
return use_count*price*(1-discount)+(cnt-use_count)*price;
}
}
测试用例
//一个Bulk_quote,编号为li 单价20 最小折扣数量10 折扣20%
Bulk_quote bq("li", 20.00, 10, 0.2);
std::cout<<bq.new_price(22,10)<<std::endl;;
15.8
静态类型在编译时候就已经编译好
动态类型需要在运行时根据传入的实参进行判断
15.9
1,父类指针指向子类引用
2,父类引用指向子类对象
总之,基类的指针或者引用会使静态类型与动态类型分离
15.10
书上原话:ifstream 和 istringstream都继承于istream,而read函数同时也被继承,所以可以放心使用
网友评论