stw*_*stw 7 c++ virtual-functions overloading overload-resolution
请考虑以下代码:
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*)!
}
Run Code Online (Sandbox Code Playgroud)
我很想知道为什么C++选择通过this将对象的指针向上转换到基类来解析最后一行的函数调用,而不是向上转换参数f()?有什么方法可以让我得到我想要的行为吗?
Mar*_*som 10
f通过查看参数的编译时类型来选择要调用的版本.此名称解析不考虑运行时类型.由于b1是类型Bbase*,所有Bbase的成员都被考虑; 采取a的A2*是最佳匹配,所以这是被调用的那个.