C++ Prime
(暂时只有第十五章,早期读这本的时候真没记笔记的习惯)
第十五章 面向对象程序设计
OOP:概述
面向对象程序设计的的核心思想是,抽象,继承,封装,多态(动态绑定)。通过使用数据抽象可以将类的接口和数据分离;使用继承可以定义相似的类型并对其进行建模;使用动态绑定,可以在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象。
继承
通过继承联系在一起的类构成一种层次关系。通常层次关系的根部有一个基类,其他类则直接或间接的从基类继承而来,这些继承的类被称为派生类。
在C++语言中,基类将类型相关的函数与派生类不做改变直接继承的函数区分对待。对于某些函数,希望它的派生类有自身适合的版本,此时基类就将这些函数声明称虚函数。
派生类必须在其内部对所有重新定义的虚函数进行声明。派生类可以在这样的函数之前使用virtual关键词,但是不是必须得这么做。C++11新标准允许派生类可以显式地注明它使用哪个成员函数改写基类的虚函数,具体的措施是在函数的形参之后增加一个override。
动态绑定
这个函数参数传入了一个基类Quote的引用,这样既能用基类对象进行调用,也能用派生类对象进行调用这个函数。实际传入的对象类型决定了执行函数的版本。
因为上述过程中函数的运行版本由实参决定,即在运行的时候决定函数的版本,所以动态绑定也被称为运行时绑定。
定义基类和派生类
定义基类
成员函数与继承
派生类可以继承其基类的成员,当遇到如net_price这样与类型相关的函数时,派生类必须对其重新定义。换句话说,派生类需要对这些操作提供自己的新定义以覆盖从基类继承的函数定义。
在C++中,基类必须将它的两种成员函数区分开来,一种时基类希望其派生类进行覆盖的函数;另一种是基类希望派生是不进行更改直接进行继承的函数。对于前者,基类通过将它声明为虚函数。当用指针或者引用进行函数嗲用的时候,该调用将被动态绑定。
任何构造函数之外的非静态函数都可以是虚函数。关键词virtual只能出现在类的内部,而不能用于类外部的函数定义。如果基类把一个函数声明称虚函数,则该函数在派生类中隐式的也是虚函数。
访问与控制
派生类可以继承定义在基类中的成员,但是派生类不一定有权访问从基类中继承而来的成员。和其他使用基类的代码一样,派生类能访问公有成员,而不能访问私有成员。不过基类中的protected成员,禁止了其他用户访问,但是派生类有权访问。
定义派生类
派生类必须通过类派生列表明确的指出它从哪个(些)基类继承而来。类派生列表的行驶时,首先是一个冒号,后面紧跟着以逗号分隔的基类列表,其中每个基类前面可以由三种访问控制符种的一个:public,private,protected
如果是公有继承过来的,则基类中的公有成员也是派生类接口的组成部分。此外我们能将公有派生类型的对象绑定到基类的引用和指针上。
派生类中的虚函数
派生类经常覆盖继承的虚函数,如果不覆盖,那么就会直接基础在基类中的版本。
派生类对象及派生类向基类的类型转换
一个派生类对象包含多个组成部分,一个含有派生类自己定义的(非静态)成员的子对象,以及一个与该派生类继承的基类对应的子对象,如果有多个基类,那么这样的子对象也有多个。
由于派生类一定有基类的成员,而基类不一定有派生类的成员,所以基类的指针可以指向派生类,基类。而派生类的指针不能指向其基类。
原因就是派生类含有其基类的组成部分
派生类构造函数
尽管在派生类对象中含有从基类继承而来的成员,但是派生类不能直接初始化这些成员,派生类必须使用积累的构造函数对这些基类部分的成员进行初始化。
派生类使用基类的成员
派生类可以访问基类的公有成员和受保护成员
派生类的作用域嵌套在基类的作用域之内。
文章评论