c++primer 15.1-15.10

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函数同时也被继承,所以可以放心使用

推荐阅读更多精彩内容