请考虑以下代码:
class Abase{};
class A1:public Abase{};
class A2:public A1{};
//etc
class Bbase{
public:
virtual void f(Abase* a);
virtual void f(A1* a);
virtual void f(A2* a);
};
class B1:public Bbase{
public:
void f(A1* a);
};
class B2:public Bbase{
public:
void f(A2* a);
};
int main(){
A1* a1=new A1();
A2* a2=new A2();
Bbase* b1=new B1();
Bbase* b2=new B2();
b1->f(a1); // calls B1::f(A1*), ok
b2->f(a2); // calls B2::f(A2*), ok
b2->f(a1); // calls Bbase::f(A1*), ok
b1->f(a2); // calls Bbase::f(A2*), no- want B1::f(A1*)!
}
我想知道为什么C++选择通过将对象的
this
指针上移到基类而不是f()
的参数来解析最后一行的函数调用?有什么办法可以使我获得想要的行为? 最佳答案
通过查看参数的编译时类型来选择要调用的f
版本。此名称解析不考虑运行时类型。由于b1
的类型为Bbase*
,因此将考虑所有Bbase
的成员;需要A2*
的那个是最好的匹配,所以这就是被调用的那个。