C++之面向对象程序设计之

——————面向对象程序设计的核心思想是:数据抽象、继承和动态绑定。


一、定义基类和派生类

  • 定义基类

  基类通常应该有一个虚析构函数,即使该函数不执行任何实际操作也是如此。

  • 成员函数与继承

  在C++中,基类必须将它的两种成员函数分开:一种是基类希望其派生类覆盖的函数;一种是基类希望其派生类直接继承的函数。对于前者我们希望将其定义为虚函数(virtual function),当我们使用指针或引用调用虚函数时,该调用将会动态绑定。根据引用或指针所绑定对象的不同,该调用可能执行基类的版本,也可能执行派生类的版本。

  基类通过在成员函数前加上关键字virtual来使得该函数执行动态绑定,任何构造函数之外的非静态函数都可以是虚函数。关键字virtual只能出现在类内部的声明语句之前而不能用于类外部的函数定义。如果基类将一个函数声明为虚函数,则在派生类中该函数也隐式的是虚函数

  如果成员函数没有被声明为虚函数,则其解析过程发生在编译时而非运行时。


  • 定义派生类

  派生类必须使用类派生列表(class derived list)明确指出它是从哪个类中继承来的。类派生列表的形式是:

class Bulk_quote : public Quote{
}

 访问说明符的作用是:控制派生类从基类继承而来的成员是否对派生类的用户可见。如果一个派生是public,则基类的公有成员也是派生类接口的组成部分。也可以将公有派生类型的对象绑定到基类的引用或指针上。

  • 派生类中的虚函数

  C++允许派生类显式的注定它的某个成员函数覆盖了继承的虚函数。做法是在形参列表后面、或在const成员函数的const关键字后面、或在引用成员函数的引用限定符后面添加一个关键字override.

  可以将基类的指针或引用绑定到派生类对象中的基类部分上,这种转换叫做派生类到基类(derived-to-base)的类型转换。

  • 派生类构造函数

  每个类控制它自己的成员初始化过程,所以派生类也必须使用基类的构造函数来初始化它的基类部分。派生类对象的基类部分与派生类对象自己的数据成员都是在构造函数的初始化阶段执行初始化操作的。首先初始化基类的部分,然后按照声明的顺序依次初始化派生类的成员。

  每个类负责定义自己的接口,要想与类的对象交互必须使用该类的接口,即使这个对象是派生类的基类部分也是如此。

  • 静态成员的继承

  若基类中定义了一个静态成员,则在整个体系中只存在该成员的唯一定义。不论从基类中派生出多少个类,每个静态成员都只存在唯一的实例。静态成员遵循通用的方位控制规则。

  • 可以用作基类的类

  可用作基类的类,必须被定义,而不是仅仅声明。即一个类不能派生它本身。

  • 防止继承发生

  若一个类不想其他类继承它,即在类名后跟一个关键字final.

1 class NoDerived final {/*...*/}

  


  • 基类和派生类之间的类型转换

  我们可以将基类的指针和引用绑定到派生类对象上,当使用基类的引用(或指针时),我们并不清楚该引用或指针所绑定对象的真实类型,也可能是基类对象,也可能是派生类对象。

  • 静态类型与动态类型

   静态类型在编译时是已知的,它是变量声明时的类型或表达式生成的类型。动态类型则是变量或表达式表示的内存中的对象的模型。


猜你喜欢

转载自www.cnblogs.com/ccpang/p/11360467.html