父類子類指針相互轉換問題


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;}
};


void main()
{
    Base *pB=new Base();
    cout<<"當基類指針指向基類對象時:"<<endl;
    pB->f();
    pB->g();
    pB->h();
    cout<<endl;

    Derived *pD=(Derived*)pB;
    cout<<"當父類指針被強制轉換成子類指針時:"<<endl;
    pD->f();
    pD->g();
    pD->h();
    cout<<endl;

    Derived *pd=new Derived();
    cout<<"當子類指針指向子類時候"<<endl;
    pd->f();
    pd->g();
    pd->h();
    cout<<endl;

    Base *pb=(Base *)pd;
    cout<<"當子類指針被強制轉換成父類指針時:"<<endl;
    pb->f();
    pb->g();
    pb->h();
    cout<<endl;

    Base *pp=new Derived();
    cout<<"父類指針指向子類對象時候:"<<endl;
    pp->f();
    pp->g();
    pp->h();
    cout<<endl;
}

執行結果如下圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM