首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

高品質 C++/C 程式設計指南:隱式轉換導致多載歧義與成員函數多載/覆蓋/隱藏辨析

     編輯:VC 教學

隱式轉換產生多載歧義


void output(int x)  { cout << "int " << x << endl; }
void output(float x){ cout << "float " << x << endl; }

output(1);    // OK: int
output(1.0f); // OK: float
// output(0.5); // Error: 0.5 是 double,可隱式轉 int 或 float → 模稜兩可
output(int(0.5));    // OK: 強制轉 int → 0
output(float(0.5));  // OK: 強制轉 float → 0.5

解決:明確轉型或避免同名多載接受可隱式轉換的型別(如 int/float/double 混用)。

成員函數三大概念對照

特性多載覆蓋隱藏
範圍同一類別基類/衍生類基類/衍生類
名稱相同相同相同
參數不同相同相同或不同
virtual可有可無基類必須 virtual無關
目的同名不同參多型行為非預期遮蔽

範例:多載、覆蓋、隱藏共存


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

class Derived : public Base {
public:
    virtual void f(float) { cout << "Derived::f(float)"; } // 覆蓋
    void g(int) { cout << "Derived::g(int)"; }             // 隱藏 Base::g(float)
    void h(float) { cout << "Derived::h(float)"; }         // 隱藏 Base::h(float) (非 virtual)
};

指標型別決定呼叫行為(隱藏的後果)


Derived d;
Base* pb = &d;
Derived* pd = &d;

pb->f(3.14f); // Derived::f(float)  虛函數動態繫結
pd->f(3.14f); // Derived::f(float)

pb->g(3.14f); // Base::g(float)     非虛函數靜態繫結 → 隱藏導致基類版本被呼叫
pd->g(3.14f); // Derived::g(int)    隱藏版本,3.14f 隱式轉 int → 3

pb->h(3.14f); // Base::h(float)     同 g
pd->h(3.14f); // Derived::h(float)  隱藏版本

隱藏導致靜態繫結行為隨指標型別改變,極易產生難以發現的 Bug。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved