面向对象程序设计的核心思想:
- 数据抽象:将类的接口与实现分类。
- 继承:可以定义相似的类型并对其相似关系建模。
- 动态绑定:我们能用同一段代码分别处理不同的对象。相同函数,根据动态绑定的对象实质进行区别。在运行时选择函数的版本,所以动态绑定有时又被称为 运行时绑定
1. 继承Inheritance
通过继承联系在一起的类构成一种层次关系,通常在层次关系的根部有一个 基类base class,其他类则直接或间接的从基类继承而来,这些继承得到的类称为 派生类derived class。
派生类可以继承其基类的成员,但是针对特定的操作,派生类可以提供自己新的定义,还可以覆盖从基类继承而来的旧定义。
2. 动态绑定dynamic binding
当使用指针或者引用调用虚函数时,该调用将动态绑定,根据引用或指针所绑定的对象类型不同,该调用可能执行基类的版本,也可能执行某个派生类的版本。
- 静态类型:表达式的静态类型在编译时总是已知的,它是变量声明时的类型或表达式生成的类型。
- 动态类型:变量或表达式表示的内存中的对象类型到运行时才可以知道。
- 如果表达式既不是引用也不是指针,则它的动态类型永远与静态一致。
2.1 虚函数virutal function
基类希望它的派生类各自定义适合自身版本,将这些函数声明为虚函数;派生类必须通过派生类列表明确指明他是从那个基类继承而来的。即 基类希望派生类能进行覆盖的函数
2.2 在 C++ 语言中,使用基类的引用或者指针调用一个虚函数时将发生动态绑定。
eg. C++ 11 新标准允许派生类显示地注明它将使用哪个成员函数改写基类的虚函数,具体措施是在函数的形参列表之后再加一个 override 关键字。