type
status
date
slug
summary
tags
category
icon
password
Property
纯虚函数
纯虚函数在虚函数的后面加上了
=0
:抽象类
基类中添加了至少一个纯虚函数的基类称为抽象类。
设计抽象类的目的,是为了给其他类提供一个可以继承的适当的基类。抽象类不能被用于实例化对象,它只能作为接口使用。如果试图实例化一个抽象类的对象,会导致编译错误。如果
override
是直接要求你重写,那设计成抽象类就是间接要求你重写。Disc_quote
类是通用的打折书的概念,而不是具体的策略。所以,应当阻止用户实例化此类的对象。通过将 net_price
定义为纯虚函数来实现这个设计目标,并且明确告知 net_price
函数没有任何含义。在函数参数列表后,分号前写上
= 0
来表明一个虚函数是纯虚函数,= 0
只能出现在类体内的虚函数声明处:尽管
Disc_quote
不能被直接创建对象,其派生类的构造函数依然需要使用Disc_quote
的构造函数来构建Disc_quote
类部分。值得一提的是,可以给纯虚函数提供一个定义,然而,函数体必须在类外进行定义,不能类内给一个纯虚函数提供定义。从抽象基类继承的派生类必须定义所有纯虚函数,否则派生类也是抽象的。
派生类构造函数只能初始化其直接基类
此版本中的
Bulk_quote
有一个直接基类 Disc_quote
,和一个非直接基类Quote
,每个Bulk_quote
对象有三个子对象:Bulk_quote
部分,Disc_quote
部分和 Quote
类的子对象。由于每个类控制本类对象的初始化过程,因而,即便
Bulk_quote
类没有任何数据成员,它依然需要 4 个构造函数参数。构造函数先调用直接基类Disc_quote
的构造函数进行初始化,这个构造函数先调用它自己的直接基类Quote
的构造函数进行初始化,但Quote
的构造函数执行完返回时,Disc_quote
构造函数将继续执行,并最终返回到 Bulk_quote
构造函数,这个构造函数没有任何额外的事需要做,直接返回。抽象类指针
虽然父类是抽象类不能定义对象,但是可以定义指针。定义指针时如果new父类对象因为是纯虚函数,自然是new不出来的,但是可以new子类对象:
重构
重构(refactoring)需要重新设计类继承体系,并将操作或数据从一个类移动到另一个类。重构在面向对象编程中十分常见。值得一提的是即便改变了继承层次,使用
Bulk_quote
和 Quote
类的代码将保持不变,但需要重新编译整个代码。