虚函数

来源:互联网 发布:个人备忘录java程序 编辑:程序博客网 时间:2024/06/04 18:15

普通成员函数的调用实在编译时静态区分;

虚函数实在运行时动态的zhixing ;根据虚函数表;


定义: 

在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数  
语法: 
virtual  函数返回类型  函数名(参数表) { 
         函数体 } 
用途: 
    实现多态性,通过指向派生类的基类指针,访问派生类中同名覆盖成员函数。也就是说, 利用多态性,可以在基类和派生类中使用同样的函数名而定义不同的操作,从而实现“一个 接口,多种方法”  
    虚函数是一个类的成员函数,定义格式如下:         virtual 返回类型 函数名(参数表);     
    关键字virtual指明该成员函数为虚函数。virtual仅用于类定义中,如虚函数在类外定义,不可加virtual。 
    当某一个类的一个类成员函数被定义为虚函数,则由该类派生出来的所有派生类中,该函数始终保持虚函数的特征。 
    当在派生类中重新定义虚函数(overriding a virtual function,亦译作超载或覆盖)时,不必加关键字virtual。但重新定义时不仅要同名,而且它的参数表和返回类型全部与基类中的虚函数一样,否则联编时出错。 
    虚函数与在前节中介绍的派生类的第二步——改造类成员,同名覆盖(override)有关:如未加关键字virtual,则是普通的派生类中的新成员函数覆盖基类同名成员函数(当然参数表必须一样,否则是重载),可称为同名覆盖函数,它不能实现运行时的多态性。  
例1.  虚函数实现多态性 
#include <iostream.h> 
class Pet                             //基类 {  public: 
   virtual void Speak() 
   { cout<<"How does a pet speak ?"<<endl;    } }; 
class Cat : public Pet                //派生类 {  public: 
   virtual void Speak() 
   { cout<<"miao!miao!"<<endl;    } }  
虚函数的使用限制 
    应通过指针或引用调用虚函数,而不要以对象名调用虚函数 说明语句 
    在派生类中重定义的基类虚函数仍为虚函数,同时可以 省略virtual关键字 

    不能定义虚构造函数,可以定义虚析构函数


虚函数的具体使用:
      1. 在一个基类和派生类的成员函数中,可以直接调用等级中的虚函数。此时,需要给据成员函数中的this指正和他所指向的对象来判断调用的是那个函数。

      2.在构造函数和析构函数中调用虚函数时,采用静态编译,即它们所调用的虚函数是自己的类或者他的基类中的虚函数,但不是任何派生类中定义的虚函数。


0 0