关闭

C++的多态

标签: C++ 多态 虚函数
52人阅读 评论(0) 收藏 举报
分类:

     多态是面向对象的一个重要特性,如果一种语言只支持类而不支持多态,只能称为是基于对象的,如VB。C++是面向对象的程序设计语言,利用多态特性可以更加利于扩展。

     在C++程序设计中,多态是指具有不同功能的函数(不同但相似)可以共用同一个函数名,即通过一个相同的函数名可以调用不同功能的函数。多态分为静态多态(编译时确定具体函数功能,通过函数的重载实现)与动态多态(运行时确定具体函数功能,通过虚函数实现)。

    1、虚函数(Vritual Function)

    虚函数允许基类对象调用子类的虚函数(要经过对象转化),即子类中的虚函数可以取代原来的虚函数,因此在使用基类指针指向子类的对象后,调用函数时就调用了子类中的虚函数。

    把基类中某一函数定义为虚函数后,允许但不必须对该函数重新定义(重定义时要保证声明的形式一模一样),赋予它新的功能。

    C++规定,当基类中的函数被声明为虚函数后,其子类中的同名函数被自动声明为虚函数,但最好加上virtual,保持程序更加清晰,如子类中没有重新定义此虚函数,则派生类中简单的继承其基类中的虚函数。

    实现:

    (1)定义一个指向基类对象的指针变量,并使它指向同一类族中的某一对象(指针可以向下指,但不能向上指,即只可以指向子类对象)

    (2)通过指针变量调用此虚函数,此时调用的指针变量是指向子类中的同名函数。

       纯虚函数

 基类中该函数并没有实际作用,但是在派生类中却都发挥了很大的作用,为了有上述虚函数的多态性的有点,我们在基类中将这个函数声明为纯虚函数。为了简化,可以不写出这种无意义的函数题,只给出函数的原型,并在后面加 “= 0”    (pure virtual function)

  virtual 函数类型 函数名 (参数列表)= 0;   //如virtual float area() = 0;

  1. 纯虚函数没有函数体
  2. 最后面的“=0”并不表示函数返回值为0,它只是起形式上的作用,告诉编译系统“这是纯虚函数”,这是一个声明语句,所以后面要有分号。

  纯虚函数只是有函数的名字而不具备函数的功能,不能被调用。它的作用是在基类中为其派生类保留一个函数的名字,一边派生类根据需要对它进行定义。因为如果没有在基类中保留函数名字,则无法实现多态性。如果在一个类中声明了纯虚函数,而在其派生类中没有对该函数进行定义,则该虚函数在派生类中仍然为纯虚函数。(即不能被调用)

    抽象类

    含有纯虚函数的类均称为抽象类,该类的目的不是创建对象,而是作为基类实现多态,它是无法创建对象的。

    虚函数与纯虚函数小结:

  1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstractclass)。
  2. 虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态的形式调用,而纯虚函数必须在子类(sub class)中实现该函数才可以使用,因为纯虚函数在基类(base class)只有声明而没有定义。
  3. 虚函数和纯虚函数都可以在子类(sub class)中被重载,以多态的形式被调用。
  4. 虚函数和纯虚函数通常存在于抽象基类(abstract base class -ABC)之中,被继承的子类重载,目的是提供一个统一的接口。
  5. 虚函数的定义形式:virtual 函数类型 函数名 (参数列表){method body}     纯虚函数的定义形式:virtual 函数类型 函数名 (参数列表) = 0; 
  6. 在虚函数和纯虚函数的定义中不能有static标识符,原因很简单,被static修饰的函数在编译时候要求前期bind,然而虚函数却是动态绑定(run-time bind),而且被两者修饰的函数生命周期(life recycle)也不一样。
  7. 如果一个类中含有纯虚函数,那么任何试图对该类进行实例化的语句都将导致错误的产生,因为抽象基类(ABC)是不能被直接调用的。必须被子类继承重载以后,根据要求调用其子类的方法。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4563次
    • 积分:586
    • 等级:
    • 排名:千里之外
    • 原创:54篇
    • 转载:5篇
    • 译文:1篇
    • 评论:9条
    文章分类
    最新评论