多态性(polymorphism)是面向对象程序设计的一个重要特征。利用多态性可以设计和实现一个易于扩展的系统。
在C++程序设计中,多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数。
在面向对象方法中一般是这样表述多态性的:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法)。
也就是说,每个对象可以用自己的方式去响应共同的消息。
在C++程序设计中,在不同的类中定义了其响应消息的方法,那么使用这些类时,不必考虑它们是什么类型,只要发布消息即可。
从系统实现的角度看,多态性分为两类:静态多态性和动态多态性。
以前学过的函数重载和运算符重载实现的多态性属于静态多态性,在程序编译时系统就能决定调用的是哪个函数,因此静态多态性又称编译时的多态性。
静态多态性是通过函数的重载实现的,运算符重载实质上也是函数重载。
动态多态性是在程序运行过程中才动态地确定操作所针对的对象。它又称运行时的多态性。
动态多态性是通过虚函数(virtual function)实现的。
实现过程:
声明一个基类指针,先使这个指针指向一个基类,通过指针调用函数虚函数func();
然后使此指针指向一个派生类,通过指针可以调用与基类函数func同名的函数func();
总结:
基类指针可以根据指向的类到底是基类还是派生类,来调用不同类的同名函数。
函数重载处理的是
同一层次的函数同名的问题,虚函数处理的是
不同派生层次上的函数重名问题。
前者可以被称为
横向重载,后者可以被称为
纵向重载。
前者在编译期间确定调用的是哪一个函数,被称为
静态关联;后者在运行期间确定,被称为
动态关联。
多态性类型 |
静态
| 动态 |
实现
|
函数重载
|
虚函数
|
类族的派生层次 | 同一层次 |
不同层次
|
重载方向
|
横向重载
|
纵向重载
|
函数的确定时期 |
编译时期
|
运行期间
|
代码清单:
#include <iostream>
#include <stdlib.h>
using namespace std;
//基类
class Student
{
public :
Student(int s_num, int s_score)
{
this->num = s_num;
this->score = s_score;
}
//~Student{ }
virtual void Show()
{
cout<<"student's num is "<<this->num<<endl;
cout<<"student's score is "<<this->score<<endl;
cout<<"\n";
}
int num;
int score;
};
//派生类
class Graduate : public Student
{
public:
Graduate(int s_num, int s_score, int s_pay) : Student(s_num, s_score)
{
this->pay = s_pay;
}
//~Graduate(){ }
void Show()
{
cout<<"graduate's num is "<<this->num<<endl;
cout<<"graduate's score is "<<this->score<<endl;
cout<<"graduate's pay is "<<this->pay<<endl;
cout<<"\n";
}
int pay;
};
int main(void)
{
Student *sPtr = NULL;
Student stu(100, 589);
Graduate gra(101, 600, 8000);
sPtr = &stu;
sPtr->Show();
sPtr = &gra;
sPtr->Show();
system("pause");
return 0;
}
输出结果:
student's num is 100
student's score is 589
graduate's num is 101
graduate's score is 600
graduate's pay is 8000