派生類對象地址賦給基類指針后, 指針對基類和派生類的函數調用


將 派生類對象地址 賦值給 基類指針派生類指針 后, 同名函數可能會發生 override隱藏 情況.

override: 派生類函數與基類函數同名, 參數也相同, 且基類函數含有 virtual 關鍵字

隱藏: 指派生類的函數屏蔽了與其同名的基類函數. 規則如下:

  1. 派生類函數與基類函數同名, 參數不同, 則不論是否有virtual關鍵字,基類函數會被隱藏;
  2. 派生類函數與基類函數同名, 參數相同, 沒有virtual關鍵字, 基類函數會被隱藏.

以上摘抄自  << 程序員面試寶典 >>


 

感覺隱藏還是針對派生類指針來說啊, 被賦值給基類指針的派生類對象地址, 這個指針還是會調用沒有被override的基類函數. 指向了派生類對象的基類部分? 

#include <iostream>
using namespace std;

class base{
public:
    virtual void f(float x) { cout << "Base::f(float) " << x <<  endl; }
    void g(float x) { cout << "Base::g(float) " << x << endl; }
    void h(float x) { cout << "Base::h(float) " << x << endl; }
};

class derived: public base{
public:
    virtual void f(float x) { cout << "Derived::f(float) " << x << endl; }
    void g(int x) { cout << "Derived::g(int) " << x << endl; }
    void h(float x) { cout << "Derived::h(float) " << x << endl; }
};

int main()
{
    derived DD;
    base *pb = &DD;
    derived *pd = &DD;
pb
->f(3.14f); pd->f(3.14f); pb->g(2.22f); pd->g(2.22f); pb->g(2); pd->g(2); pb->h(1.21f); pd->h(1.21f); }

運行結果:  (在這個頁面編寫執行的)    // 空格是自己加的, 為了好看

Derived::f(float) 3.14
Derived::f(float) 3.14

Base::g(float) 2.22 Derived::g(int) 2

Base::g(float) 2 Derived::g(int) 2

Base::h(float) 1.21 Derived::h(float) 1.21

 

 

 


免責聲明!

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



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