多态和虚函数的使用

来源:互联网 发布:澳门有mac专柜吗 编辑:程序博客网 时间:2024/06/05 13:28

上一篇博文我提到virtual用法,同时谈到它在多态的实现中有至关重要的位置。现在我们来学习多态到底是什么及其是如何实现的。
在C++中有两种多态性:
1>编译时的多态:通过函数的重载和运算符的重载来实现。
2>运行时的多态:无法根据函数名和参数来确定该调用哪个函数,必须在程序执行过程中,根据执行的具体情况来动态地确定。它是通过类继承关系和虚函数来实现的。

在类继承中我们的父类对象,指针或引用只能访问父类的成员函数(http://blog.csdn.net/f15829107089/article/details/77104019)在这篇文章里我有讲解,那么咋样才能访问到子类的函数并且使得程序具有通用性呢。下面我们看个例子:
这里写图片描述
这里写图片描述
这样我吗可以清楚的看到加virtual之后父类指针访问的是子类的函数,所以实现多态有三个要求:
1>继承体系 2>必须有virtual关键字 3>函数必须达到三同(返回值,函数名,参数列表)
参数列表必须是,参数个数和类型必须相同,不然不能达到多态。
这里写图片描述
看到了么在这里我们函数没有和父类无参show函数达到三同就没有访问子类的show(int)。

当某一个类的一个类成员函数被定义为虚函数,则由该类派生出来的所有派生类中,该函数始终保持虚函数特征。
这里写图片描述
在其他程序都不变,加入新类S并且继承D类,我们用D类指针访问show方法时虽然父类D方法没有申明为virtual但是我们依然访问的是子类S的show()函数。说明我们的虚函数在继承体系中始终保持虚特性。

  1. 派生类中定义虚函数必须与基类中的虚函数同名外,还必须同参数表,同返回类型。否则被认为是重载,而不是虚函数。如基类中返回基类指针,派生类中返回派生类指针是允许的,这是一个例外。(这个例外vc6.0不支持,vs支持)
  2. 只有类的成员函数才能说明为虚函数。这是因为虚函数仅适用于有继承关系的类对象。
  3. 静态成员函数,是所有同一类对象共有,不受限于某个对象,不能作为虚函数。
  4. 一个类对象的静态和动态类型是相同的,实现动态多态性时,必须使用基类类型的指针变量或引用,使该指针指向该基类的不同派生类的对象,并通过该指针指向虚函数,才能实现动态的多态性。
  5. 内联函数每个对象一个拷贝,无映射关系,不能作为虚函数。
  6. 析构函数可定义为虚函数,构造函数不能定义虚函数,因为在调用构造函数时对象还没有完成实例化。在基类中及其派生类中都动态分配的内存空间时,必须把析构函数定义为虚函数,实现撤消对象时的多态性。
  7. 函数执行速度要稍慢一些。为了实现多态性,每一个派生类中均要保存相应虚函数的入口地址表,函数的调用机制也是间接实现。所以多态性总是要付出一定代价,但通用性是一个更高的目标。
  8. 如果定义放在类外,virtual只能加在函数声明前面,不能(再)加在函数定义前面。正确的定义必须不包括virtual。

有错误之处还请指教。