1、多态性的基本概念:面向对象的三大特性分别为封装性、继承性和多态性,利用多态性和虚函数使得软件可扩展性大大加强了。多态性是指对于同一命令,不同的对象执行不同的操作。
2、多态性的实现机制:静态绑定(早绑定)和动态绑定(晚绑定),其中“绑定”是指对于同名的函数的选择问题,就是程序如何选择同名的函数。一般来说同名函数的实现方式有三种:
(1)运算符重载;
(2)重载函数;
(3)虚函数。
其中,运算符重载和函数重载属于静态绑定,而虚函数属于动态绑定;静态绑定也称为早绑定,是因为在程序编译期间编译器就已经选好了要执行的函数,而虚函数实现的动态绑定是告诉编译器先不要进行静态绑定,等到程序执行的时候再进行选择。
重载函数主要是在执行函数调用时,编译器会根据同名函数中参数列表中的参数个数和参数类型以及返回值类型选择匹配度最高的函数进行调用。运算符重载就是通过对一些基本运算符的重定义使得类可以像一般数据类型一样参与运算。
3、运用对象指针和虚函数来实现多态性
(1)派生类从基类而来,派生类包含了基类的所有成员,那么派生类的对象中就包含了基类的对象,可以利用基类的指针指向派生类对象的地址,但是不能将派生类对象的指针指向基类对象,这样是没有任何意义的。因为基类不能完整地表达派生类对象,而派生类可以完整地表达基类,也就是说将派生类中去掉一些对象就可以将其变为基类。
(2)虚函数的定义格式:
virtual <类型> <成员函数> (参数列表)
{
//函数体
}
作用:虚函数的作用是可以通过基类的指针或者对象的引用来访问基类和派生类中被声明为虚函数的同名函数。
(3)要想通过对象指针来实现同名函数的访问,那么一定要注意要将函数定义为虚函数,也就是在编译期间不要进行绑定,这样在程序执行的时候就可以选择的执行了,下面通过一个例子进行说明。
/*************************************************
时间:2016年10月5日16:15:02
功能:利用虚函数的对象指针实现同名函数的选择访问
**************************************************/
#include <iostream>
using namespace std;
class Transport //定义基类
{
public:
Transport() //基类构造函数
{
cout<<"in transport constructor"<<endl;
}
virtual void transport() //成员虚函数
{
cout<<"in transport function"<<endl;
}
};
class Car : public Transport //定义派生类Car
{
public:
Car() //派生类构造函数
{
cout<<"in Car constructor"<<endl;
}
virtual void transport() //与基类同名的虚函数
{
cout<<"in car function"<<endl;
}
};
class Boat : public Transport //定义派生类Boat
{
public:
Boat() //派生类构造函数
{
cout<<"in Boat construct"<<endl;
}
virtual void transport() //与基类同名的虚函数
{
cout<<"in boat function"<<endl;
}
};
void main()
{
Car c; //定义派生类对象
Boat b;
Transport *pt = &c;
pt->transport();
pt = &b;
pt->transport();
}
程序运行结果如下图:
从执行结果的倒数三、四行是通过基类的对象指针来实现同名函数的调用,由于指针指向的对象不同,程序将会调用不同的函数来执行;最后两行是通过基类的引用来实现同名函数的调用。