请教这个程序(关于多态)

来源:百度知道 编辑:UC知道 时间:2024/05/27 02:48:25
#include<iostream>
using namespace std;
class a
{
public:
virtual void fo()
{
cout<<"A"<<endl;
}
};
class b:public a
{
public:
virtual void fo()
{
cout<<"B"<<endl;
}
};
int main()
{
a *pa = new a();
pa->fo(); //--------1
b *pb = (b*)pa;
pb->fo(); //--------2
delete pa,pb;
pa = new b();
pa->fo(); //--------3
pb = (b*)pa;
pb->fo(); //--------4
return 0;
}
输出结果是 AABB
为何第2个输出是A?
b *pb = (b*)pa;这个语句将pa指针转变成b类型的指针再赋值给pb,pb->fo()应该是指向b::fo()吧?
对这里有点不解!
#include<iostream>
using namespace std;
class a
{
public:
virtual void fo()
{
cout<<"A"<<endl;
}
};
class b:public a
{
public:
virtual void fo()
{
cou

b *pb = (b*)pa;
pb->fo(); //--------2

这个是吧,pa是类a的对象的指针,转换成它的子类b 的指针是错误的,转换后根本就找不了fo()的地址,但因为fo()是虚函数,所以它会调用它的父类 a 中的函数 fo()。
如果你在类b中添加一个类a 中没有的函数,然后将类a的对象指针转换成类b的指针,再调用b中的函数,你就会发现出错了。
子类指针可以转换成父类,但父类的不能转换成子类。

b *pb = (b*)pa;
pb->fo(); //--------2
a是基类,b是派生类,派生类的范畴比基类丰富。举个例子,飞机是基类,直升飞机是派生类,直升飞机一定是飞机,飞机却不一定是直升飞机。