假设:
struct A {
virtual int foo(const A& a) const { return 1; }
};
struct B : A {
virtual int foo(const A& a) const { return 2; }
virtual int foo(const B& b) const { return 3; }
};
void testOverloadingBinding(const A& a,const B& b) {
cout << a.foo(b);
}
int main() {
testOverloadingBinding(B(),B());
}
它打印2.我认为它打印3,因为this
绑定是动态的,据我所知,重载具有静态绑定。
任何人都可以解释一下编译器如何决定在这里调用哪个函数?
答案 0 :(得分:4)
此:
virtual int foo(const B& b) const;
不是对此的覆盖:
virtual int foo(const A& a) const;
因此,永远不能通过对A
的引用来调用它。
答案 1 :(得分:1)
virtual int foo(const B& b) const;
不会覆盖任何内容,因此编译器会选择第一个函数。但是,可能在将来,我们将有一个动态类型分辨率,在这种情况下编译器将选择第二个函数。 有关详细信息,请参阅http://www2.research.att.com/~bs/multimethods.pdf
答案 2 :(得分:1)
没有可供解决的过载。您呼叫foo
的对象的类型为A
,而A
中只有一个函数foo(const A&)
存在。动态调度产生基类中的函数。在C ++中,成员函数由其名称及其参数标识。在父节点中不存在的基础中添加重载将不会启用动态调度。