• C++在容器中放置有继承关系的对象和指针区别


    《C++ Primer 5》15.28和15.29两题

    1 .h头文件:包括父类Quote和子类Bulk_quote的定义

    bookQuote.h:

    #pragma once
    #include<iostream>
    #include<string>
    
    using namespace std;
    
    class Quote {
    	//friend ostream& operator<<(ostream&, Quote&);
    public:
    	Quote() = default;
    	Quote(const string& book = "", double sales_price = 0.0) :bookNo(book), price(sales_price) {}
    
    	string isbn() const {
    		return bookNo;
    	}
    
    	virtual double net_price(size_t n) const {
    		return n * price;
    	}
    
    	virtual ~Quote(){}
    private:
    	string bookNo;
    protected:
    	double price = 0.0;
    };
    
    class Bulk_quote :public Quote {
    public:
    	Bulk_quote(const string& book = "", double sales_price = 0.0, size_t qty = 0, double disc = 0.0) :
    		Quote(book, sales_price), min_qty(qty), discount(disc) {}
    
    	double net_price(size_t cnt) const {
    		if (cnt > min_qty) {
    			return cnt * (1 - discount) * price;
    		}
    		else {
    			return cnt * price;
    		}
    	}
    
    	~Bulk_quote(){}
    private:
    	size_t min_qty;
    	double discount;
    };
    

    2-1 .cpp文件:定义父类Quote对象的vector容器,存入子类Bulk_quote对象

    #include<iostream>
    #include<string>
    #include<vector>
    #include"bookQuote.h" //1中定义的.h头文件
    #include<memory> //shared_ptr智能指针
    using namespace std;
    
    int main() {
    	vector<Quote> itemVec;
    	for (size_t i = 0;i != 10;++i) {
    		Bulk_quote item("C++ Primer 5", 6, 5, 0.5);
    		itemVec.push_back(item);
    	}
    	double sum = 0;
    	for (auto iter = itemVec.begin();iter != itemVec.end();++iter) {
    		sum += iter->net_price(10);
    	}
    	cout << sum << endl;
    	return 0;
    }
    

    输出结果,600。

    2-2 .cpp文件:定义指向父类Quote对象的智能指针的vector容器,存入指向子类Bulk_quote对象的智能指针

    #include<iostream>
    #include<string>
    #include<vector>
    #include"bookQuote.h"
    #include<memory>
    using namespace std;
    
    int main() {
    	vector<shared_ptr<Quote>> itemVec;
    	for (size_t i = 0;i != 10;++i) {
    		Bulk_quote item("C++ Primer 5", 6, 5, 0.5);
    		itemVec.push_back(make_shared<Bulk_quote>(item));
    	}
    	double sum = 0;
    	for (auto iter = itemVec.begin();iter != itemVec.end();++iter) {
    		sum += (*iter)->net_price(10);
    	}
    	cout << sum << endl;
    	return 0;
    }
    

    输出结果:300。

  • 相关阅读:
    强连通 HDU 1827
    强联通 HDU 2767 3836
    强连通 HDU 1269
    网络流 poj 2135
    强联通 poj 2762
    android20-[【转】Android的EditText自动获取焦点并弹出输入法问题]
    windows开发中的一点总结
    android19
    android18
    android17
  • 原文地址:https://www.cnblogs.com/dindin1995/p/13059126.html
Copyright © 2020-2023  润新知