基类指针转换为子类指针,子类指针转换为基类指针

来源:互联网 发布:金融网络销售靠谱吗 编辑:程序博客网 时间:2024/04/30 15:19
#include<iostream>#include<typeinfo>using namespace std;class base{   public:        virtual void virtual_fun()        {cout<<"base"<<endl;}               void normal_fun()        {cout<<"base"<<endl;}};class derived{   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();}


程序运行结果:

derived
base
base
derived


由此可得:

(1)    基类指针=(基类指针类型)new 派生类;

       该指针调用虚函数时,调用派生类的虚函数。(多态)

       调用非虚函数,调用的是基类的函数。

(2)    派生类指针=(派生类指针类型)new 基类;

       调用虚函数时,调用基类的虚函数。

       调用非虚函数,调用的是派生的函数。

总结:

    在继承层次中,存在向上指针类型转换或者向下类型转换,则调用成员函数(两个类都实现了)调用的是哪个类的函数,遵循下面2个规则:

(1)调用虚函数时,因为是动态绑定,所以根据指针指向的对象的实际类型来决定。

(2)调用非虚函数,静态决定,所以根据表面山看到的类的类型来决定。