Quote.h
class Quote {
public:
Quote() = default;
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()= default;
Quote(const Quote&q):bookNo(q.bookNo),price(q.price){}
Quote &operator=(const Quote&q)
{bookNo=q.bookNo;price=q.price;
return *this;}
private:
std::string bookNo;
protected:
double price;
};
Disc_quote.h
#include "Quote.h"
class Disc_quote: public Quote{
public:
Disc_quote()= default;
Disc_quote(const std::string &book, double price,
std::size_t qty, double disc):
Quote(book,price),quantity(qty),discount(disc){}
double net_price(std::size_t n) const=0;
Disc_quote(const Disc_quote &dq):Quote(dq),quantity(dq.quantity),
discount(dq.discount){}
//派生类拷贝赋值运算符必须显示地为其基类部分赋值
Disc_quote & operator=(const Disc_quote&dq){
Quote::operator=(dq);
quantity=dq.quantity;
discount=dq.discount;
return *this;
}
~Disc_quote(){}
protected:
std::size_t quantity=0;
double discount=0.0;
};
Bulk_quote.h
#include <iostream>
#include "Disc_quote.h"
class Bulk_quote:public Disc_quote{
public:
Bulk_quote()= default;
// Bulk_quote(const std::string &book, double price,
// std::size_t qty, double disc):Disc_quote(book,price,qty,disc){std::cout << "Bulk_quote's constructor" << std::endl;}
using Disc_quote::Disc_quote;//这里的“继承”得来的构造函数与正常的构造函数等价
Bulk_quote(const Bulk_quote &bq):Disc_quote(bq){}
Bulk_quote &operator=(const Bulk_quote &bq);
double net_price(std::size_t n)const override { return n*price;}
~Bulk_quote();//这里只是声明
};
Bulk_quote.cpp
#include "Bulk_quote.h"
Bulk_quote::~Bulk_quote() {}
Bulk_quote& Bulk_quote::operator=(const Bulk_quote &bq) {Disc_quote::operator=(bq);}
main.cpp
#include <iostream>
#include "Quote.h"
#include "Disc_quote.h"
#include "Bulk_quote.h"
int main() {
//Disc_quote("23214",90.0,9,0.3); 含有纯虚函数,为抽象基类 不能实例化
Bulk_quote bq( "978-7-121-25229-7", 89.0, 10, 0.2 );
Bulk_quote bq1( "978-7-121-15535-2", 128.0, 7, 0.9 );
Bulk_quote bq2 = bq;
bq2 = bq1;
return 0;
}
1.在这里出现了声明和实现的混用。最好是将声明和实现分开。
在Bulk_quote.h和Bulk_quote.cpp中对析构函数和拷贝赋值运算符的声明和实现是分开进行的。
2.对于Bulk_quote的自定义的构造函数可以“继承”自Disc_quote的构造函数两者的形参列表相同。
3.默认、拷贝和移动构造函数不能会被继承。这些构造函数按照正常规则被合成。