概述
第五章主要讲的是面向对象编程风格,是C++基于对象的编程风格的一个进阶吧!应该是个精华部分!好好啃!好好学!
面向对象编程概念
- class的主要用途是引入一个崭新的数据类型,能够更直接地在我们所设计的程序系统中表现我们想表现的实体。
- 类间的关系需要“面向对象编程模型”加以设定。
- 面向对象编程概念最主要特质:继承和多态
继承概述
- 继承是将一群相关的类组织起来,分享这些类之间的共通数据和操作行为
- 继承机制定义着父子关系。
- 父类(基类)定义着所有子类共通的共有接口和私有实现
- 子类(派生类)可以增加/覆盖继承从父类而来的东西,以实现子类自身独特行为,比如子类AudioBook从父类Book里继承作者和标题外,还增加了谁讲的和消耗卡带数并改写从父类继承来的check_out()函数
- 父类和子类之间的关系称为继承关系。
- 抽象基类:仅仅为了设计/编程需要而存在的类,不代表任何实际的(子)类,多用于定义派生类的共同操作
- 间接利用指向抽象基类的指针或引用来操作一个类系统中的各个类对象,而非直接操作各个实际对象,这有什么好处呢?就是可以不在改动原有程序的前提下,加入或移除任何一个派生类。
举个例子:
void loan_check_in(LibMat &mat)//注意这个&,是指向抽象基类的引用
{
//mat代表某个派生类的对象
//LibMat是抽象基类
mat.check_in();
if(mat.is_late())
{
mat.assess_fine();
}
if(mat.waiting_list())
{
mat.notify_available();
}
}
程序实际上不存在LibMat类(抽象基类)的类对象,只有派生类的类对象。但mat.check_in()函数这个成员函数被调用,该函数必须被解析为mat代表的实际类对象里的成员函数check_in(),外层loan_check_in()函数被调用时,mat得是某个实际的类对象。所以这是个问题。
所以就有了多态。
多态
- 多态是在这些类上进行编程时,如同操控这些类聚合而成的单一个体并非相互独立的类,并可以更灵活地来加入或移除特定的类
- 多态让基类的指针或引用得以十分透明地指向其任何一个派生类的对象。 比如上面的loan_check_in()函数,mat类对象总得代表LibMat这个抽象基类的派生类类对象。是哪个呢?这个编译时确定不了,得程序运行时具体确定。于是就有了动态绑定。
动态绑定
- 在非面向对象的编程风格中,写下这一行
mat.check_in();
编译器在编译时根据mat所属的类决定执行哪个类的check_in()成员函数。这也是静态绑定,即程序执行前已解析出应该调用哪个类的成员函数。 - 而动态绑定在程序执行时依据抽象基类的类对象所代表的实际对象解析出应该调用哪个派生类的成员函数
总结
- 继承特性让我们可以定义一整群互有关联的类,并共享通用的接口
- 多态则让我们可以用一种与类型无关的方式来操作类对象,通过抽象基类的指针或引用来操纵一整群互有关联的类的共同接口
- 动态绑定在程序执行时隐居抽象基类的指针或引用所指的是基类对象的类型才能决定。