重载的虚函数调用解析

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*是最佳匹配,所以这是被调用的那个.