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(intB::*)