2010年(9)
分类: C/C++
2010-05-21 21:00:34
虚函数、多态、纯虚函数及接口
1. 虚函数
虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型。以实现统一的接口,不同定义过程。如果在派生类中没有对虚函数重新定义,则它继承其基类的虚函数。
当程序发现虚函数名前的关键字virtual后,会自动将其作为动态联编处理,即在程序运行时动态地选择合适的成员函数。因此,当我们给一个对象发送消息时,这个对象将做正确的事情,即使是在有向上类型转换的情况下。
动态联编规定,只能通过指向基类的指针或基类对象的引用来达到多态效果,其格式为:
指向基类的指针变量名->虚函数名(实参表)
或 基类对象的引用名. 虚函数名(实参表)
而以下代码虽然是虚函数,但不是多态的。
|
2. 多态:
多态是指不同类型的对象可以响应相同的消息。从相同的基类派生出来的多个类型可被当作同一种类型对待,可对这些不同的类型进行同样的处理,由于多态性,这些不同派生类对象响应同一方法时的行为是有所差别的。
多态的目的:所有的对象都可被塑造为相同的类型,响应相同的消息,使代码变得简单且容易理解,并使程序具有很好的“扩展性”。
3.虚函数与纯虚函数
定义一个函数为虚函数,不代表函数为不被实现的函数。定义它为虚函数是为了允许用基类的指针或基类对象的引用来调用子类的这个函数。
定义一个函数为纯虚函数,才代表函数没有被实现。定义它是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序必须实现这个函数。
虚函数为了重载和多态的需要,在基类中是由定义的,即便定义是空,所以子类中可以重写也可以不写基类中的函数!
纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数!
4.接口的定义
有时候,我们得提供一些接口给别人使用。接口的作用,就是提供一个与其他系统交互的方法。其他系统无需了解你内部细节,并且也无法了解内部细节,只能通过你提供给外部的接口来与你进行通信。根据c++的特点,我们可以采用纯虚函数的方式来实现。这样做的好处是能够实现封装和多态。