c++primer 15.24-15.30

15.24
基类一般定义一个虚析构函数
但是虚析构函数会阻止移动操作
但是虚析构函数会帮助基类派生类体系动态销毁对象
15.25
Disc_quote定义的默认构造函数执行时会调用Quote的默认构造函数,Quote的默认构造函数则会对Quote的成员进行初始化,若是将这个默认构造函数删除,Bulk_quote是Disc_quote的子类,在它调用默认构造函数的时候会因为找不到其直接基类Disc_quote的默认构造函数而产生错误
15.26
注意虚函数继承后要有定义,不能光有声明,然后

#include 
#include
#include
class Quote{
    friend bool operator !=(const Quote& lhs,const Quote& rhs);
public:
    Quote() = default;
    Quote(const std::string &b,double p):bookNo(b),price(p){std::cout<<"两参数构造函数"< discount_policy() const{
        return {quantity,discount};
    }
    Disc_quote() = default;
    Disc_quote(const std::string & book,double price,std::size_t qty,double disc):
        Quote(book,price),
        quantity(qty),discount(disc){}
    Disc_quote(const Disc_quote&dq):Quote(dq),quantity(dq.quantity),discount(dq.discount){}
    //Disc_quote(const Disc_quote&& dq):Quote(std::move(dq)),quantity(std::move(dq.quantity)),discount(std::move(dq.discount)){}


    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(){std::cout<<"Bulk_quote的默认构造函数"<

使用的main函数

#include 
#include"Base.h"
#include
#include

int main(){

    std::vector backet;
    backet.push_back(Quote("0-201-82448-1",50));
    backet.push_back(Bulk_quote("0-201-54848-8",50,10,.25));
    //注释解释上传的运行结果的执行过程,稍微有点绕
    //构造一个Quote的对象   Q双参
    //使用Quoete的移动构造函数将刚才生成的Quote对象移动到vector中    Q移动构造,就不用Q的双参数构造了
    //被移动的对象销毁      析构
    //先Q的双参数构造,再Bulk_quote的四参数构造
    //Bulk_quote切掉派生类部分,这个过程使用了Quote的移动构造
    //在vector中又将切完的Quote对象移动构造过来
    //切完的Quote移动完执行析构
    //Bulk_quote的析构--先派生析构,再基类析构
    //程序完成,最后再将vector里面的两个Quote对象析构
    return 0;
}

运行结果


image.png

15.27
要继承Disc_quote的构造函数
只需要加上

using Disc_quote::Disc_quote;

就能获得Disc_quote类的所有构造函数的继承
15.28and15.29

29题使用智能指针,并不会把基类之外的内容切掉,也就是保留了net_price函数的Bulk_quote版本,所以调用net_price的时候实际上是调用的Bulk_quote的版本

#include 
#include"Base.h"
#include
#include

int main(){

    //15.28
    std::vector vec;
    for (int i = 1; i != 3; ++i)
        vec.push_back(Bulk_quote("sss", i * 10, 10, 0.3));
    double total = 0;
    for (const auto& b : vec)
    {
        total += b.net_price(1);
    }
    std::cout << total << std::endl;
    std::cout << "======================"<> pvec;
    for (int i = 1; i != 3; ++i)
        pvec.push_back(std::make_shared(Bulk_quote("sss", i * 10, 1, 0.3)));
    double total_p = 0;
    for (auto p : pvec)
    {
        total_p += p->net_price(1);
    }
    std::cout << total_p << std::endl;
    return 0;
}

你可能感兴趣的:(c++primer 15.24-15.30)