首页 > 代码库 > 基类和派生类中构造函数和拷贝控制
基类和派生类中构造函数和拷贝控制
15.26 定义Quote和Bulk_quote的拷贝控制成员,令其与合成的版本行为一致。为这些成员以及其他构造函数添加打印状态的语句,使得我们能够知道正在运行哪个程序。使用这些类编写程序,预测程序将创建和销毁哪些对象。重复实验,不断比较你的预测和实际输出结果是否相同,直到预测完全准确再结束。
Quote.h
#ifndef QUOTE_H#define QUOTE_H#include<iostream>#include<string>using namespace std;class Quote{public: Quote()=default; Quote(const string &book,double sales_price):bookNo(book),price(sales_price) {} string isbn() const {return bookNo;} virtual double net_price(size_t n) const { return n*price;} virtual ~Quote() { cout<<"Quote destruct"<<endl; } virtual void debug(size_t ) const; Quote(const Quote "e):bookNo(quote.bookNo),price(quote.price) { cout<<"Quote copy construct"<<endl; } Quote(Quote &"e):bookNo(std::move(quote.bookNo)),price(std::move(quote.price)) { cout<<"Quote move construce"<<endl; } Quote& operator=(const Quote "e) { cout<<" Quote = copy construct"<<endl; bookNo=quote.bookNo; price=quote.price; return *this; } Quote& operator=(Quote&& quote) { cout<<"Quote = move construct"<<endl; bookNo=std::move(quote.bookNo); price=std::move(quote.price); return *this; }private: string bookNo;protected: double price=0.0;};class Disc_quote:public Quote{public: Disc_quote()=default; Disc_quote(const string &book,double price,size_t qty,double disc):Quote(book,price),quantity(qty),discount(disc) {} Disc_quote(const Disc_quote &disc):Quote(disc),quantity(disc.quantity),discount(disc.discount) { cout<<"Disc_quote copy construct"<<endl; } Disc_quote(Disc_quote &&disc):Quote(std::move(disc)),quantity(std::move(disc.quantity)),discount(std::move(disc.discount)) { cout<<"Disc_quote move construct"<<endl; } Disc_quote& operator=(const Disc_quote &disc) { cout<<" Disc_quote = copy construct"<<endl; Quote::operator=(disc); quantity=disc.quantity; discount=disc.discount; return *this; } Disc_quote& operator=(Disc_quote &&disc) { cout<<" Disc_quote = move construct"<<endl; Quote::operator=(std::move(disc)); quantity=std::move(disc.quantity); discount=std::move(disc.discount); return *this; } ~Disc_quote() { cout<<"Disc_quote destruct"<<endl; } double net_price(size_t) const=0;protected: size_t quantity=0; double discount=0.0;};class Bulk_quote:public Disc_quote{public: Bulk_quote()=default; Bulk_quote(const string &, double , size_t , double ); Bulk_quote(const Bulk_quote &bulk):Disc_quote(bulk) { cout<<"Bulk_quote copy construct"<<endl; } Bulk_quote(Bulk_quote &&bulk):Disc_quote(std::move(bulk)) { cout<<"Bulk_quote move construct"<<endl; } Bulk_quote& operator=(const Bulk_quote &bulk) { cout<<" Bulk_quote = copy construct"<<endl; Disc_quote::operator=(bulk); return *this; } Bulk_quote& operator=(Bulk_quote &&bulk) { cout<<"Bulk_quote = move construct"<<endl; Disc_quote::operator=(std::move(bulk)); return *this; } ~Bulk_quote() { cout<<"Bulk_quote destruct"<<endl; } double net_price(size_t) const override; void debug(size_t) const override ;};#endif // QUOTE_H
Quote.cpp
#include"Quote.h"Bulk_quote::Bulk_quote(const string &book, double p, size_t qty, double disc):Disc_quote(book,p,qty,disc) {}inline double Bulk_quote::net_price(size_t cnt) const{ if(cnt<=quantity) return cnt*(1-discount)*price; else return (cnt-quantity)*price+quantity*(1-discount)*price;}void Quote::debug(size_t n) const{ cout<<isbn()<<" "<<net_price(n)<<endl;}void Bulk_quote::debug(size_t n) const{ cout<<isbn()<<" "<<net_price(n)<<endl;}
main.cpp
#include <iostream>#include"Quote.h"using namespace std;double print_total(ostream &os,const Quote &item,size_t n){ double ret=item.net_price(n); os<<"ISBN: "<<item.isbn()<<" # sold: "<<n<<" total due: "<<ret<<endl; cout<<endl; item.debug(n); return ret;}int main(){ Quote quote("Base",2); Bulk_quote bulk("devired",2,5,0.5); print_total(cout,quote,6); print_total(cout,bulk,6); return 0;}
基类和派生类中构造函数和拷贝控制
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。