父类与子类指针相互转化的问题

1.当自己的类指针指向自己类的对象时,无论调用的是虚函数还是实函数,其调用的都是自己的:
2.当指向父类对象的父类指针被强制转换成子类指针时候,子类指针调用函数时,只有非重写函数是自己的,虚函数是父类的;
3.当指向子类对象的子类指针被强制转换成父类指针的时候,也就是父类指针指向子类对象,此时,父类指针调用的虚函数都是子类的,而非虚函数都是自己的;
总结:当父类子类有同名非虚函数的时候,调用的是转换后的指针类型的函数
   当父类子类有同名虚函数的时候呢,调用的是指针转换前指向的对象类型的函数

#include <iostream>
using namespace std;
class Base {
public:
    virtual void f() { cout << "Base::f" << endl; }
    virtual void g() { cout << "Base::g" << endl; }
            void h() { cout << "Base::h" << endl; }

};
class Derived:public Base
{
public:
    virtual void f(){cout<<"Derived::f"<<endl;}
            void g(){cout<<"Derived::g"<<endl;}
            void h(){cout<<"Derived::h"<<endl;}
};
int main()
{
    Base *pB=new Base();
    cout<<"当基类指针指向基类对象时:"<<endl;
    pB->f();//Base::f
    pB->g();//Base::g
    pB->h();//Base::h

    Derived *pD=(Derived*)pB;
    cout<<"当父类指针被强制转换成子类指针时:"<<endl;
    pD->f();//Base::f
    pD->g();//Base::g
    pD->h();//Derived::h
    
    Derived *pd=new Derived();
    cout<<"当子类指针指向子类时候"<<endl;
    pd->f();//Derived::f
    pd->g();//Derived::g
    pd->h();//Derived::h

    Base *pb=(Base *)pd;
    cout<<"当子类指针被强制转换成父类指针时:"<<endl;
    pb->f();//Derived::f
    pb->g();//Derived::g
    pb->h();//Base::h

    Base *pp=new Derived();
    cout<<"父类指针指向子类对象时候:"<<endl;
    pp->f();//Derived::f
    pp->g();//Derived::g
    pp->h();//Base::h
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章