C++ 类层次结构中的重载

示例

以下示例将使用此类的层次结构:

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); // 呼叫f(A)

从派生类到基类的指针转换也比转换成更好void*。

void f(A* p);
void f(void* p);
B b;
f(&b); // 呼叫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); // 呼叫f(int B :: *)