c++ 继承
继承
## 虚函数
```cpp
class Quote {
public:
std::string isbn() const;
virtual double net_price(std::size_t n) const;
};
```
## 类派生列表
```cpp
class Bulk_quote:public Quote { //Bulk_quote 继承了 Quote
public:
double net_price(std::size_t) const override;
};
```
## 动态绑定
```cpp
//计算并打印销售给定数量的某种书籍所得的费用
double print_total(ostream &os,
const Quote &item, size_t n)
{
//根据传入item形参的对象类型调用Quote::net_price
//或者Bulk_quote::net_price
double ret = item.net_price(n);
os<<"ISBN: "<<item.isbn() //调用Quote::isbn
<<" # sold: "<<n<<" total due: "<<ret<<endl;
return ret;
}
```
## 运行时绑定
```cpp
//basic 的类型是Quote;bulk的类型是Bulk_quote
print_total(cout,basic,20); //调用Quote的net_price
print_total(cout,bulk,20); //调用Bulk_quote的net_price
```
# 定义基类和派生类
```cpp
#include "string"
class Quote2
{
public:
Quote2() = default; //关于 =default
Quote2(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 ~Quote2() = default; //对析构函数进行动态绑定
private:
std::string bookNo;//书籍的ISBN编号
protected:
double price = 0.0; //代表普通状态下不打折的价格
};
Quote2::Quote2(/* args */)
{
}
Quote2::~Quote2()
{
}
```
> 现在只需要记住作为继承关系中根节点的类通常会定义一个虚析构函数。
# 定义派生类
```cpp
class Bulk_quote2 : public Quote2 //Bulk_quote继承自Quote2
{
public:
Bulk_quote2(/* args */) = default;
Bulk_quote2(const std::string&,double,std::size_t,double);
//覆盖基类的函数版本以实现基于大量购买的折扣政策
double net_price(std::size_t) const override;
~Bulk_quote2();
private:
std::size_t min_qty = 0; //适用折扣政策的最低购买量
double discount = 0.0; //以小数表示的折扣额
};
Bulk_quote2::Bulk_quote2(/* args */)
{
}
Bulk_quote2::~Bulk_quote2()
{
}
```
# 派生类对象及派生类向基类的类型转换
```cpp
Quote2 item; //基类对象
Bulk_quote2 bulk; //派生类对象
Quote2 *p = &item; //p指向Quote2对象
p = &bulk; //p指向bulk的Quote2部分
Quote2 & r = bulk; //r绑定到bulk的Quote2部分
```
# 派生类构造函数
```cpp
Bulk_quote2(const std::string& book,double p,
std::size_t qty,double disc) :
Quote2(book,p),min_qty(qty),discount(disc){ }
```
> 首先初始化基类的部分,然后按照声明的顺序依次初始化派生类的成员。
# 派生类使用基类的成员
```cpp
//如果达到了购买书籍的某个最低限量值,就可以享受折扣价格了
double Bulk_quote::net_price(size_t cnt) const
{
if(cnt >= min_qty)
return cnt * (1 - discount) * price;
else
return cnt * price;
}
```
