VC++深入详解:虚函数与多态性
2008-11-24 19:37:17 来源:WEB开发网因为鱼的呼吸是吐泡泡,和一般动物的呼吸不太一样,所以我们在fish类中重新定义breathe方法。我们希望如果对象是鱼,就调用fish类的breathe()方法,如果对象是动物,那么就调用animal类的breathe()方法。程序代码如例2-16所示(EX08.CPP)。
例2-16
#include <iostream.h>
class animal
{
public:
void eat()
{
cout<<"animal eat"<<endl;
}
void sleep()
{
cout<<"animal sleep"<<endl;
}
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类中重新定义了breathe()方法,采用吐泡泡的方式进行呼吸。接着定义了一个全局函数fn(),指向animal类的指针作为fn()函数的参数。在main()函数中,定义了一个fish类的对象,将它的地址赋给了animal类的指针变量pAn,然后调用fn()函数。看到这里,我们可能会有些疑惑,照理说,C++是强类型的语言,对类型的检查应该是非常严格的,但是,我们将fish类的对象fh的地址直接赋给指向animal类的指针变量,C++编译器居然不报错。这是因为fish对象也是一个animal对象,将fish类型转换为animal类型不用强制类型转换,C++编译器会自动进行这种转换。反过来,则不能把animal对象看成是fish对象,如果一个animal对象确实是fish对象,那么在程序中需要进行强制类型转换,这样编译才不会报错。
赞助商链接