读书人

一段程序解决思路

发布时间: 2012-02-14 19:19:19 作者: rapoo

一段程序
#include <iostream>
using namespace std;
class Base
{public:
virtual void show(){cout < < "Base ";}
};
class Derived:public Base
{public:
void show(){cout < < "Derived ";}
};
int main()
{Base b;
Derived *pd;
pd=(Derived *)&b;
pd-> show();
return 0;
}


为什么输出base?派生类的指针不是应该指向派生类的虚函数?

[解决办法]
把virtual去掉结果如何?结果输出 "Derived "!
如果不加virtual,那么因为pd-> show()是通过Derived指针调用的,所以输出 "Derived ".
加了virtual之后,系统通过实际对象判断应该调用哪个函数(一般是通过在类对象中隐含的虚函数表),而不是通过指针判断。所以,b本来就是Base类型的,因此输出 "Base ".

Base * pb=new Derived;
pb-> show();
这时就输出Derived了,这是典型的多态应用。通过Base指针调用Derived函数。

读书人网 >C++

热点推荐