forked from demon90s/CppStudy
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexample_derived_class.cpp
More file actions
117 lines (93 loc) · 2.37 KB
/
Copy pathexample_derived_class.cpp
File metadata and controls
117 lines (93 loc) · 2.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// example: 定义派生类(p529)
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
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; // 对析构函数进行动态绑定
virtual void debug() const
{
cout << "bookNo: " << bookNo << endl
<< "price: " << price << endl;
}
private:
std::string bookNo;
protected:
double price = 0.0; // 代表普通状态下不打折的价格
};
class Bulk_quote : public Quote // Bulk继承自Quote
{
public:
Bulk_quote() = default;
Bulk_quote(const std::string &book, double p, std::size_t qty, double disc)
: Quote(book, p), min_qty(qty), discount(disc) {}
// 覆盖基类的函数版本以实现基于大量购买的折扣政策
double net_price(std::size_t cnt) const override
{
if (cnt >= min_qty)
return cnt * (1 - discount) * price;
else
return cnt * price;
}
void debug() const override
{
Quote::debug();
cout << "min_qty: " << min_qty << endl
<< "discount: " << discount << endl;
}
private:
std::size_t min_qty = 0; // 适用折扣政策的最低购买量
double discount = 0.0; // 以小数表示的折扣额
};
// 练习15.11
void func1()
{
Quote *quote = nullptr;
Quote base("0-201-70353-X", 5);
Bulk_quote derived("0-201-70353-X", 5, 5, 0.5);
quote = &base;
quote->debug();
quote = &derived;
quote->debug();
}
// 练习15.28
void func2()
{
vector<Quote> basket = {
Bulk_quote("0-201-70353-X", 5, 5, 0.5),
Bulk_quote("0-201-70354-X", 6, 5, 0.5),
Bulk_quote("0-201-70355-X", 7, 5, 0.5),
};
double total = 0;
for (const auto &item : basket)
total += item.net_price(10);
cout << "total: " << total << endl;
}
// 练习15.29
void func3()
{
vector<shared_ptr<Quote>> basket = {
make_shared<Bulk_quote>("0-201-70353-X", 5, 5, 0.5),
make_shared<Bulk_quote>("0-201-70354-X", 6, 5, 0.5),
make_shared<Bulk_quote>("0-201-70355-X", 7, 5, 0.5),
};
double total = 0;
for (const auto &item : basket)
total += item->net_price(10);
cout << "total: " << total << endl;
}
int main()
{
//func1();
//func2();
func3();
return 0;
}