3、
#include<iostream>
#include<string>
class Quote{
public:
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(){
}
protected:
double price;
private:
std::string bookNo;
};
4、
①、错误,类不能继承自本身
②、正确
③、错误,类的声明中不能包含它的派生列表
5、
class Bulk_quote::public Quote{
public:
bulk_quote();//默认构造函数
bulk_quote(string& book, double p, size_t n, double disc):Quote(book,p),min_qty(n),discount(disc){};//派生类构造函数
//virtual double net_price(size_t) const;//重新声明,与下面的方式作用相同
double net_price(size_t) const override;//允许派生类显示的注明它将使用哪个成员函数改写基类的虚函数
//除了自定义的版本,还可以访问其基类的相应成员
private:
double discount =0.0;//适用折扣的最低购买量
size_t min_qty = 0;//折扣额,C++11新标准
}
8、9、10
知识点1:当我们用一个派生类的对象给一个基类对象初始化或赋值时,只有派生类对象的基类部分会被拷贝、移动或赋值,sliced down。
关键点:存在继承关系的类型之间转换
- 从派生类向基类转换只有对指针或者引用类型有效
- 基类到派生类不存在隐式转换
- 派生类到基类转换也可能由于访问限制变得不可行
26
**知识点1:**默认情况下,基类的默认构造函数初始化派生类对象的基类部分,同理,如果我们拷贝或者移动基类部分,则必须在派生类的构造函数初始值列表中显式地使用基类的拷贝(或移动构造函数)。
**知识点2:**知识点1不一样的是析构函数。
**知识点3:**如果构造函数或者析构函数调用了某个虚函数,那么我们应该执行与构造函数和析构函数所属类类型相对应的虚函数版本