关于C++多态的一些思考(编译期绑定和运行期绑定)

**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函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值