问题描述
请考虑以下代码:
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*)!
}
$ b $ p我有兴趣知道为什么C ++选择解析函数调用最后一行通过将对象的这个
指针向上转换到基类,而不是上传 f()的参数
?
I'm interested to know why C++ chooses to resolve the function call on the last line by upcasting the this
pointer of the object to the base class, rather than upcasting the argument of f()
? Is there any way that I can get the behaviour I want?
推荐答案
选择哪个版本的 f
通过查看参数的编译时类型进行调用。此名称解析不考虑运行时类型。由于 b1
的类型为 Bbase *
,所有 Bbase
考虑成员;一个 A2 *
是最好的匹配,所以这是一个被调用。
The choice of which version of f
to call is made by looking at the compile-time type of the parameter. The run-time type isn't considered for this name resolution. Since b1
is of type Bbase*
, all of Bbase
's members are considered; the one that takes an A2*
is the best match, so that's the one that gets called.
这篇关于重载虚拟函数调用解析的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!