请考虑以下代码:

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

09-10 00:07
查看更多