虚函数与多态性 纯虚函数

来源:互联网 发布:网络测试工程师待遇 编辑:程序博客网 时间:2024/05/16 17:45
 多态性(Polymorphism)

   指一个名字,多种语义;

   一个接口,多种方法

•  所谓多态性是指当不同的对象收到相同的消息时,

   产生不同的动作。

• C++的多态性具体体现在运行和编译两个方面:

   在程序运行时的多态性通过继承和虚函数来体现;

   在程序编译时多态性体现在函数和运算符的重载上

 
Ø   虚函数是在基类中冠以关键字 virtual 的成员函数。

     它提供了一种接口界面。

Ø 虚函数可以在一个或多个派生类中被重定义。
Ø 实现运行时多态的关键首先是要说明虚函数,

  必须用基类指针调用派生类的不同实现版本

虚函数的作用:

允许在派生类中对基类的虚函数重新定义。

Ø能用virtual声明类的成员函数,只能用于类的继承层次结构中。  

   不能将类外的普通函数(友员)和静态成员函数声明成虚函数。

   构造函数不能声明为虚函数!

Ø 在派生类中重新定义虚函数,要求函数名、函数类型、函数参

    数个数和类型全部与基类的虚函数完全相同。

    否则不能实现多态性, 为函数重载.

Ø一个成员函数被声明为虚函数后,在同一类族中的不能再定义  与该虚函数具有相同的参数和返回类型的非virtual同名函数。
Ø 派生类中可以根据需要重新定义虚函数,保持虚函数特性;

   如果没有对基类的虚函数重新定义,则派生类简单地继承其直  接基类的虚函数。

Ø在派生类中重新定义虚函数

  函数名、返回类型、 参数个数、  参数类型和顺序完全相同

  如果派生类中对虚函数定义不同的参数,就无法实现多态机制。

Ø在派生类中重载基类同名函数

     如果函数原型不同,仅函数名相同,丢失虚特性

    基类中的函数为 virtual void show() const,

    派生类中的函数为void show (),

Ø 构造函数不能是虚函数

     建立一个派生类对象时,必须从类层次的根开始,

     沿着继承路径逐个调用基类的构造函数

Ø 析构函数可以是虚函数

    虚析构函数用于指引 delete 运算符正确析构动态对象

 

l纯虚函数的作用

    在基类中为其派生类保留一个函数的名字,

    以便派生类根据需要对它进行定义。

    作为接口而存在

l纯虚函数不具备函数的功能,一般不能直接被调用。

从基类继承来的纯虚函数,在派生类中仍是虚函数。

l如果一个类中至少有一个纯虚函数,那么这个类被称为抽象类(abstract class)。

   抽象类中不仅包括纯虚函数,也可包括虚函数。

l抽象类必须用作派生其他类的基类,而不能用于直接创建对象实例。

   但仍可使用指向抽象类的指针支持运行时多态性。

l派生类中应重载基类中的纯虚函数,否则它仍将被看作一个抽象类。
l抽象类不能用作函数参数类型、函数返回值类型或显式转换的类型。

   可以声明抽象类的指针和引用。

l由于抽象类的析构函数可以被声明为纯虚函数。
Ø虚函数和多态性使成员函数根据调用对象的类型产生不

   同的动作.

Ø 多态性特别适合于实现分层结构的软件系统,

   便于对问题抽象时定义共性,实现时定义区别 .

(4) 抽象基类是本类族的公共接口。

    即从同一基类派生出的多个类有同一接口。

(5) 如果在基类声明了虚函数,则在派生类中凡是与该函数有相同的函数名、函数类型、参数个数和类型的函数,均为虚函数。