在類層次結構中過載

以下示例將使用此類層次結構:

struct A { int m; };
struct B : A {};
struct C : B {};

從派生類型別到基類型別的轉換優先於使用者定義的轉換。當通過值或通過引用傳遞時,以及將指向派生的指標轉換為指向基礎時,這適用。

struct Unrelated {
    Unrelated(B b);
};
void f(A a);
void f(Unrelated u);
B b;
f(b); // calls f(A)

從派生類到基類的指標轉換也比轉換為 void*更好。

void f(A* p);
void f(void* p);
B b;
f(&b); // calls f(A*)

如果在同一繼承鏈中存在多個過載,則首選派生的基類過載最多。這基於與虛擬排程類似的原則:選擇最專業的實現。但是,過載決策始終在編譯時發生,並且永遠不會隱式地向下轉換。

void f(const A& a);
void f(const B& b);
C c;
f(c); // calls f(const B&)
B b;
A& r = b;
f(r); // calls f(const A&); the f(const B&) overload is not viable

對於指向與類相反的成員的指標,類似的規則適用於相反的方向:最少派生的派生類是優選的。

void f(int B::*p);
void f(int C::*p);
int A::*p = &A::m;
f(p); // calls f(int B::*)