多态性和虚函数

来源:互联网 发布:如何设置sftp端口号 编辑:程序博客网 时间:2024/05/17 04:35
1、静态联编和动态联编  

  在c++中,多态性主要是通过函数名重载实现的。重载函数是指程序中对同名函数进
行调剁时,编译器会根据函数参数的类型和个数,决定该调用哪一段函数代码来处理这个
函数凋蝴。这种把函数调用与适当的函数代码相对应的动作称为联编(binding)。
   联编分为静态联编和动态联编。在编译阶段决定执行哪个同名的被调用函数,这称为
静态联编;而在编译阶段不能决定执行哪个同名的被调用函数,只在执行阶段才能依据要
处理的对象类型来决定执行哪个类的成员函数,这称为动态联编。
   多态性也分为静态和动态两种。静态多态性是指定义在一个类或一个函数中的同名函
数,它们可根据参数表(类型及个数)区别语义,并通过静态联编实现,例如在一个类中
定义的不同参数的构造函数以及运算符重载函数等。这些内容已经在本书前面几章介绍过,
本章不再讨论。动态多态性是指定义在一个类层次的不同类中的重载函数,它们一股具有
相同的参数表,因而要根据指针指向的对象所在类来区别语义,它通过动态联编实现。

 

2、声明虚函数的方法如下:

    virtual类型声明符 函数名(参数表)
其中,被关键词virtual声明的函数称为虚函数。
   如果某类中的一个成员函数被声明为虚函数,这就意味着该成员函数在派生类中可能
有不同的实现。当使用这个成员函数操作指针或引用所标识的对象时,对该成员函数调用
采取动态联编方式,即在运行时进行关联或柬定。
   动态联编只能通过指针或引用标识对象来操作虚函数。如果采用一般类型的标识对象
来操作虚函数,则将采用静态联编方式调用虚函数。
   c++动态联编的处理方式仍能实现静态类型检查,换句话说,函数参数类型的错误在
编译阶段能够检查出来。

 

3、虚函数的限制

   一个类中将所有的成员函数都尽可能地设置为虚函数总是有益的
资源开销,没有其他坏处。在设置虚函数时必须注意下列事项;
   (1)只有类的成员函数才能声明为虚函数。这是因为,虚函数仅适用于有继承关系的
类对象,所以普通函数不能声明为虚函数。
   (2)静态成员函数不能是虚函数,因为静态成员函数不受限于某个对象。
   (3)内联函数不能是虚函数,因为内联函数是不能在运行中动态确定位置的。即使虚
函数在类的内部定义,编译时仍将其看作是非内联的。
   (4)构造函数不能是虚函数,因为构造时对象还是一片未定型的空间。只有在构造完
成后,对象才能成为一个类的名副其实的实例。
   (5)析构函数可以是虚函数,而且通常声明为虚函数。
   使用虚析构函数的目的在于:使用delete运算符删除一个对象时,能确保析构函数被正
确地执行。这是因为,设置虚析构函数后,可以利用动态联编方式选择祈构函数。


4、纯虚函数

   基类的虚函数有时候不可能被调用到,这时可定义该虚函数为纯虚函数。纯虚函数没
有函数体,但一定要进行声明,它告诉编译器,派生类必须定义该成员函数。

   纯虚函数是一种特殊的虚函数,纯虚函数是在虚函数的后面加上“=o”,表示该虚函
数无函数体,并非赋值运算。纯虚函数的一股格式如下:
   virtual  类型 函数名 (多数表) = 0;
   许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它
的实现留给该基类的派生类去做。

 

5、抽象类

   有时,基类往往表示一些抽象的概念,它的成员函数并没有什么实际意义,这时可将
它定义成一个抽象类。所谓抽象类是指至少有一个纯虚函数的类。
   抽象类是一种特殊的类,它是为了抽象和设计的目的而建立的,它处于继承层次结构
的上层。抽象类的主要作用是将有关的类组织在一个继承层次结构中,由它来为它们提供
一个公共的报,相关的子类是从这个根派生出来的。
   对于抽象类的使用有以下几点规定;
   ·抽象类只能用作其他类的基类,不能建立抽象类对象。
   ·抽象类不能用作参数类型、函数返回类型或显式转换的类型。
   ·可以声明指向抽象类的指针和引用,此指针可以指向它的派生类

原创粉丝点击