父類與子類指針相互轉化的問題

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
}

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