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;
}