**C++中的多态必须具有以下三个前提条件:
1.必须存在一个继承体系结构
2.继承体系结构中的一些类必须具有同名的virtual成员函数(virtual是关键字)
3.至少有一个基类类型的指针或基类类型的引用。这个指针和引用可以对virtual成员函数进行调用
**
一、考虑面向对象程序设计(c++语言描述)书上的一段程序清单,此时是(运行期绑定)
#include<iostream>
using namespace std;
class TradePerson{
public:
virtual void sayHi(){cout<<"Just hi."<<endl;}
};
clas Tinker:public TradesPerson{
public:
virtual void sayHi(){cout<<"Hi,I tinker."<<endl;}
};
class Tailor:public TradesPerson{
public:
virtual void sayHi(){cout<<"Hi,I tailor."<<endl;}
};
int main(){
TradesPerson* p;
int which;
do{
cout<<"1==TradesPerson,2==Tinker,3==Tailor";
cin>>which;
}while(which<1||which>3);
switch (which) {
case 1:p=new TradesPerson;break;
case 2:p=new Tinker;break;
case 3:p=new Tailor;break;
}
p->sayHi();
delete p;
return 0;
}
由于sayHi()是虚函数,系统在运行期才对调用动作进行绑定。如果P指向一个TradesPerson对象,系统将p->sayHi()这个调用动作绑定到TradesPerson::sayHi。如果P指向Tinker对象,系统将p->sayHi()这个调用动作绑定到Tinker::sayHi。如果P指向Tailor对象,系统将p->sayHi()这个调用动作绑定到Tailor::sayHi。
此时,如果我们输入数据2,就会得到如下结果:
Hi, I tinker.
再次运行程序,输入数据3,得到如下结果:
Hi, I tailor.
二、将上述程序清单修改一下,此时是(编译期绑定)
#include<iostream>
using namespace std;
class TradePerson{
public:
void sayHi(){cout<<"Just hi."<<endl;}
};
clas Tinker:public TradesPerson{
public:
void sayHi(){cout<<"Hi,I tinker."<<endl;}
};
class Tailor:public TradesPerson{
public:
void sayHi(){cout<<"Hi,I tailor."<<endl;}
};
int main(){
TradesPerson* p;
int which;
do{
cout<<"1==TradesPerson,2==Tinker,3==Tailor";
cin>>which;
}while(which<1||which>3);
switch (which) {
case 1:p=new TradesPerson;break;
case 2:p=new Tinker;break;
case 3:p=new Tailor;break;
}
p->sayHi();
delete p;
return 0;
}
两个程序的区别就在于sayHi()前面是否有virtual关键字
假定用户输入2来创建Tinker对象:
p=new Tinker;
p将指向动态创建的Tinker对象,然后执行:
p->sayHi();
但是由于sayHi()不是虚函数,绑定方式为编译期绑定,又由于p的数据类型为TradesPerson*,那么编译器会将调用p->sayHi()绑定到TradesPerson::sayHi
所以下次再输入数据时,无论P实际指向的是哪个对象,都会调用TradesPerson::sayHi函数