继承构造函数

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.默认、拷贝和移动构造函数不能会被继承。这些构造函数按照正常规则被合成。

发布了58 篇原创文章 · 获赞 64 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ThorKing01/article/details/102507603