15.26
class Quote {
public:
Quote() = default;
Quote(const Quote& q) { cout << " const Quote& q " << endl; };
Quote& operator=(const Quote& dq)
{
cout << " operator= const Quote& bq " << endl;
return *this;
};
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" << endl;
};
virtual void debug()const {
cout << "book No" << bookNo << "price " << price << endl;
}
private:
std::string bookNo;
protected:
double price =0.0;
};
class Disc_quote : public Quote {
public:
Disc_quote() = default;
Disc_quote(const Disc_quote& dq) :Quote(dq) { cout << " const Disc_quote& bq " << endl; };
Disc_quote& operator=(const Disc_quote& dq)
{
Quote::operator=(dq);
cout << " operator= const Disc_quote& bq " << endl;
return *this;
};
Disc_quote(const string& book, double price, size_t qty, double disc): Quote(book,price), quantity(qty),discount(disc){
}
~Disc_quote() {
cout << "~Disc_quote" << endl;
};
virtual double net_price(size_t n ) = 0;
protected:
size_t quantity = 0;
double discount = 0.0;
};
class Bulk_quote : public Disc_quote {
public:
Bulk_quote() = default;
Bulk_quote& operator=(const Bulk_quote& dq)
{
Disc_quote::operator=(dq);
cout << " operator= const Bulk_quote& bq " << endl;
return *this;
};
~Bulk_quote() {
cout << "~Bulk_quote" << endl;
};
Bulk_quote(const Bulk_quote& bq) :Disc_quote(bq) {cout << " const Bulk_quote& bq " << endl;};
Bulk_quote(const string& book, double price, size_t qty, double disc):Disc_quote(book,price,qty,disc){}
double net_price(size_t n) {return 0.0;};
};
int main() {
{
Bulk_quote bq;
Bulk_quote bq_1(bq);
bq = bq_1;
}
for (;;);
return 0;
}
除开析构函数,其他拷贝控制函数都是从基类开始执行,而析构函数是从派生类开始执行
15.27
class Bulk_quote : public Disc_quote {
public:
//Bulk_quote() = default;
using Disc_quote::Disc_quote;
Bulk_quote& operator=(const Bulk_quote& dq)
{
Disc_quote::operator=(dq);
cout << " operator= const Bulk_quote& bq " << endl;
return *this;
};
~Bulk_quote() {
cout << "~Bulk_quote" << endl;
};
Bulk_quote(const Bulk_quote& bq) :Disc_quote(bq) {cout << " const Bulk_quote& bq " << endl;};
Bulk_quote(const string& book, double price, size_t qty, double disc):Disc_quote(book,price,qty,disc){}
double net_price(size_t n) {return 0.0;};
};
15.28:
int main() {
{
vector<Quote> basket;
Quote qt("111", 5.5);
basket.push_back(qt);
Bulk_quote bq("111", 5.7, 10, 0.7);
basket.push_back(bq);
double theSum = 0.0;
for (int i = 0; i != basket.size(); i++) {
theSum += basket[i].net_price(10);
}
cout << theSum << endl;
}
cout << "#######################" << endl;
{
vector<shared_ptr<Quote>> basket;
basket.push_back(make_shared<Quote>("111", 5.5));
basket.push_back(make_shared<Bulk_quote>("111", 5.7, 10, 0.7));
double theSum = 0.0;
for (int i = 0; i != basket.size(); i++) {
theSum += basket[i]->net_price(10);
}
cout << theSum << endl;
}
for (;;);
return 0;
}
当vector类型是Quote时,即使传入的是Bulk_quote,它也会忽略掉派生类的部分,所以算出来的值是不计算打折部分,但是当传入的值是只能指针时,指向的是那块内存地址,即使容器类型是Vector,在计算时也会动态转换成Bulk_quote来计算,所以第二次的值与第一次的值不一样