原文:http://blog.csdn.net/j123kaishichufa/article/details/9841261
把代码修改了一丢丢而已,只不过加上了正常的情况对照(*^__^*) 嘻嘻……
#include<typeinfo>
using namespace std;
class base
{
public:
virtual void virtual_fun()
{cout<<"base"<<endl;}
void normal_fun()
{cout<<"base"<<endl;}
};
class derived :public base
{
public:
virtual void virtual_fun()
{cout<<"derived"<<endl;}
void normal_fun()
{cout<<"derived"<<endl;}
};
int main()
{
base *cp=(base *)new derived;
cp->virtual_fun();
cp->normal_fun();
derived *dp=(derived *)new base;
dp->virtual_fun();
dp->normal_fun();
base*ep = new base ;
ep->virtual_fun();
ep->normal_fun();
derived *fp=new derived;
fp->virtual_fun();
fp->normal_fun();
return 0;
}
程序运行结果:
derived
base
base
derived
base
base
derived
derived
由此可得:
(1) 基类指针=(基类指针类型)new 派生类;
该指针调用虚函数时,调用派生类的虚函数。(多态)
调用非虚函数,调用的是基类的函数。
(2) 派生类指针=(派生类指针类型)new 基类;
调用虚函数时,调用基类的虚函数。
调用非虚函数,调用的是派生的函数。
总结:
在继承层次中,存在向上指针类型转换或者向下类型转换,则调用成员函数(两个类都实现了)调用的是哪个类的函数,遵循下面2个规则:
(1)调用虚函数时,因为是动态绑定,所以根据指针指向的对象的实际类型来决定。
(2)调用非虚函数,静态决定,所以根据表面山看到的类的类型来决定。