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

#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)调用非虚函数,静态决定,所以根据表面山看到的类的类型来决定。


你可能感兴趣的:(基类指针转换为子类指针,子类指针转换为基类指针)