抽象基类
2024年1月5日 2024年1月5日
纯虚函数
pure virtual
- 可以定义纯虚函数, 必须在类外
- 可以不定义纯虚函数, 声明时使用
=0
标记
只能在类的内部使用=0
Disc_quote的net_price为纯虚函数
1class Disc_quote : public Quote 2{ 3public: 4 Disc_quote() = default; 5 Disco_quote(const string &book, double price, size_t qty, double disc) : Quote(book, price), quantity(qty), discount(disc) {} 6 double net_price(size_t) const = 0; 7protected: 8 size_t quantity = 0; 9 double discount = 0.0; 10};
抽象基类
abstract base class
- 含有纯虚函数的类
- 未经覆盖直接继承纯虚函数的类
不能(直接)创建一个抽象基类的对象: 如果派生类实现了纯虚函数, 派生类对象包含抽象基类部分, 视为间接创建
派生类构造函数只初始化它的直接基类
- 此例中, Bulk_quote的直接基类为Disc_quote, 间接基类为Quote
- 每个Bulk_quote对象包含3个子对象: 空的Bulk_quote部分, Disc_quote子对象和Quote子对象
1class Bulk_quote : public Disc_quote 2{ 3public: 4 Bulk_quote() = default; 5 Bulk_quote(const string &book, double price, size_t qty, double disc) : Disc_quote(book, price, qty, disc) {} 6 // Bulk_quote调用Disc_quote, Disc_quote调用Quote 7 // 先初始化Quote子对象, 再初始化Disc_quote子对象, 最后运行Bulk_quote的构造函数 8 double net_price(size_t) const override; 9};
在Quote的继承体系中增加Disc_quote类是重构 refactoring
的一个典型示例
重构负责重新设计类的体系, 将操作和数据从一个类移动到另一个类中
注意到, 虽然增加了Disc_quote, 使用了Bulk_quote和Quote的代码无需进行改动. 需要重新编译含有这些类的代码