[2018年5月23号]C++ primer 课后练习 第十五章 面向对象程序设计

15.26
class Quote {
public:
    Quote() = default;
    Quote(const Quote& q) { cout << " const Quote& q " << endl; };
    Quote& operator=(const Quote& dq)
    {
        cout << " operator= const Quote& bq " << endl;
        return *this;
    };
    Quote(const string& book, double sales_price):bookNo(book),price(sales_price){}
    string isbn() const{return bookNo;}
    virtual double net_price(size_t n) const {return n * price;}
    virtual ~Quote(){
        cout << "~Quote" << endl;
    };
    virtual void debug()const {
        cout << "book No" << bookNo << "price " << price << endl;
    }
private:
    std::string bookNo;
protected:
    double price =0.0;
};

class Disc_quote : public Quote {
public:
    Disc_quote() = default;
    Disc_quote(const Disc_quote& dq) :Quote(dq) { cout << " const Disc_quote& bq " << endl; };
    Disc_quote& operator=(const Disc_quote& dq)
    {
        Quote::operator=(dq);
        cout << " operator= const Disc_quote& bq " << endl; 
        return *this;
    };
    Disc_quote(const string& book, double price, size_t qty, double disc): Quote(book,price), quantity(qty),discount(disc){
    
    }
    ~Disc_quote() {
        cout << "~Disc_quote" << endl;
    };
    virtual double net_price(size_t n ) = 0;
protected:
    size_t quantity = 0;
    double discount = 0.0;
};
class Bulk_quote : public Disc_quote {
public:
    Bulk_quote() = default;
    Bulk_quote& operator=(const Bulk_quote& dq)
    {
        Disc_quote::operator=(dq);
        cout << " operator= const Bulk_quote& bq " << endl;
        return *this;
    };
    ~Bulk_quote() {
        cout << "~Bulk_quote" << endl;
    };
    Bulk_quote(const Bulk_quote& bq) :Disc_quote(bq) {cout << " const Bulk_quote& bq " << endl;};
    Bulk_quote(const string& book, double price, size_t qty, double disc):Disc_quote(book,price,qty,disc){}
    double net_price(size_t n) {return 0.0;};
};

int main() {
    {
        Bulk_quote bq;
        Bulk_quote bq_1(bq);
        bq = bq_1;
    }


    for (;;);
    return 0;
}

除开析构函数,其他拷贝控制函数都是从基类开始执行,而析构函数是从派生类开始执行

15.27

class Bulk_quote : public Disc_quote {
public:
    //Bulk_quote() = default;
    using Disc_quote::Disc_quote;
    Bulk_quote& operator=(const Bulk_quote& dq)
    {
        Disc_quote::operator=(dq);
        cout << " operator= const Bulk_quote& bq " << endl;
        return *this;
    };
    ~Bulk_quote() {
        cout << "~Bulk_quote" << endl;
    };
    Bulk_quote(const Bulk_quote& bq) :Disc_quote(bq) {cout << " const Bulk_quote& bq " << endl;};
    Bulk_quote(const string& book, double price, size_t qty, double disc):Disc_quote(book,price,qty,disc){}
    double net_price(size_t n) {return 0.0;};
};

15.28:

int main() {
    {
        vector<Quote> basket;
        Quote qt("111", 5.5);
        basket.push_back(qt);
        Bulk_quote bq("111", 5.7, 10, 0.7);
        basket.push_back(bq);
        double theSum = 0.0;
        for (int i = 0; i != basket.size(); i++) {
            theSum += basket[i].net_price(10);
        }
        cout << theSum << endl;
    }
    cout << "#######################" << endl;
    {
        vector<shared_ptr<Quote>> basket;
        basket.push_back(make_shared<Quote>("111", 5.5));
        basket.push_back(make_shared<Bulk_quote>("111", 5.7, 10, 0.7));
        double theSum = 0.0;
        for (int i = 0; i != basket.size(); i++) {
            theSum += basket[i]->net_price(10);
        }
        cout << theSum << endl;
    }
    for (;;);
    return 0;
}

当vector类型是Quote时,即使传入的是Bulk_quote,它也会忽略掉派生类的部分,所以算出来的值是不计算打折部分,但是当传入的值是只能指针时,指向的是那块内存地址,即使容器类型是Vector,在计算时也会动态转换成Bulk_quote来计算,所以第二次的值与第一次的值不一样




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值