什么是多态
多态是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数
多态分为两类:静态多态和动态多态。
在程序编译 时系统就能决定调用是哪个函数,称为静态多态。静态多态是通过函数的重载实现的。
在程序运行工程中才动态的定操作所针对的对象,称为动态多态。动态多态是通过虚函数实现的。
虚函数
当把基类的某个成员函数声明为虚函数后,允许在其派生类中对改函数重新定义,赋予它新的功能,并且可以通过指向基类的指针指向同一类族中不同类的对象,从而调用其中的同名函数。
由虚函数实现的动态多态是:同一族中的不同类的对象,对同一函数调用作出不同的响应。
虚函数的使用方法是:
- 在基类用virtual声明成员函数为虚函数。这样就可以在派生类中重新定义此函数,为它赋予新的功能,并方便的被调用。
- 在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。
- 定义一个指向基类对象的指针变量,并使他指向同一类中的某一对象
- 通过该指针变量调用此虚函数,此时调用的就是指针变量指向的对象的同名函数
使用注意:
- 当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动称为虚函数。因此在派生类重新声明该虚函数时,可以加virtual,也可以不加。
- 如果在派生类中没有对基类的虚函数重新定义,则派生类简单的继承其直接基类的虚函数。
- 使用虚函数,系统要有一定的空间开销。当一个类带有虚函数时,编译系统会为该类构造一个虚函数表,它是一个指针数组,存放每个虚函数的入口地址。
虚析构函数
在程序中最好把基类的析构函数声明为虚函数。这将使所有派生类的析构函数自动称为虚函数。这样,如果程序中用delete准备删除一个对象,而delete的操作对象是指向派生类对象的基类指针,则系统会调用相应类的析构函数。
如果将基类的析构函数声明为虚函数,由该基类所派生的所有派生类的析构函数也都自动称为虚函数。
构造函数不能声明为虚函数。这是因为在执行构造方式时,类对象还未完成建立过程。
纯虚函数
纯虚函数是在声明虚函数时被初始化为0的函数:
virtual 函数类型 函数名 (参数列表)=0
纯虚函数只有函数的名字而不具备函数的功能,不能被调用。
纯虚函数的作用是在基类中为派生类保留一个函数的名字,以便派生类根据需要对它进行定义。
如果在一个类中声明了纯虚函数,而在派生类中没有对该函数定义,则该纯虚函数在派生类中仍然为纯虚函数。
抽象类
不用来定义对象而只作为一种基本类型用作继承的类,称为抽象类。由于它作为基类,通常称为抽象基类。
凡是包含纯虚函数的类都是抽象类。因为纯虚函数是不能被调用,包含纯虚函数的类是无法建立对象。抽象类的作用是作为一个类的共同基类,或者说,为一个类提供一个公共接口。