正文

[ZT]虚函数与多态性、纯虚函数2007-01-31 10:04:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/otot/22992.html

分享到:

虚函数与多态性、纯虚函数
1.虚函数与多态性
因为鱼的呼吸是吐泡泡,和一般动物的呼吸不太一样,所以我们在fish类中重新定义breathe方法。程序代码如例2-16所示。
例2-16
#include <iostream.h>
class animal{
public:
 void breathe(){  cout<<"animal breathe"<<endl; }};
class fish:public animal{
public:
 void breathe(){  cout<<"fish bubble"<<endl; }};

void fn(animal *pAn){ pAn->breathe();}
void main(){
 animal *pAn;
 fish fh;
 pAn=&fh;
 fn(pAn);// 输出的结果应该是“animal breathe”
}
为什么输出的结果不是“fish bubble”呢?这是因为在我们将fish类的对象fh的地址赋给pAn时,C++编译器进行了类型转换,此时C++编译器认为变量pAn保存就是animal对象的地址。当在fn函数中执行pAn->breathe()时,调用的当然就是animal对象的breathe函数。
现在我们在animal类的breathe()方法前面加上一个virtual关键字,结果如例2-17所示。
例2-17
#include <iostream.h>
class animal{
public:
//用virtual关键字申明的函数叫做虚函数
virtual void breathe(){  cout<<"animal breathe"<<endl; }};
class fish:public animal{
public:
 void breathe(){  cout<<"fish bubble"<<endl; }};
 
void fn(animal *pAn){ pAn->breathe();}
void main(){
 animal *pAn;
 fish fh;
 pAn=&fh;
 fn(pAn); //结果调用的是fish类的呼吸方法
}
这就是C++中的多态性。当C++编译器在编译的时候,发现animal类的breathe()函数是虚函数,这个时候C++就会采用迟绑定(late binding)技术。在运行时,依据对象的类型(在程序中,我们传递的fish类对象的地址)来确认调用的是哪一个函数,这种能力就叫做C++的多态性。我们没有在breathe()函数前加virtual关键字时,C++编译器在编译时就确定了哪个函数被调用,这叫做早期绑定(early binding)。
C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。
2.纯虚函数
将breathe()函数申明为纯虚函数,结果如例2-18所示。
例2-18
class animal{
public:
  virtual void breathe() = 0;
};
纯虚函数是指被标明为不具体实现的虚成员函数(注意:纯虚函数也可以有函数体,但这种提供函数体的用法很少见)。纯虚函数可以让类先具有一个操作名称,而没有操作内容,让派生类在继承时再去具体地给出定义。凡是含有纯虚函数的类叫做抽象类。这种类不能声明对象,只是作为基类为派生类服务。在派生类中必须完全实现基类的纯虚函数,否则,派生类也变成了抽象类,不能实例化对象。
纯虚函数多用在一些方法行为的设计上。在设计基类时,不太好确定或将来的行为多种多样,而此行为又是必需的,我们就可以在基类的设计中,以纯虚函数来声明此种行为,而不具体实现它。
注意:C++的多态性是由虚函数来实现的,而不是纯虚函数。在子类中如果有对基类虚函数的覆盖定义,无论该覆盖定义是否有virtual关键字,都是虚函数。

from:http://book.csdn.net/bookfiles/29/100294241.shtml

阅读(3691) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册