C ++动态绑定与重载

时间:2012-02-19 20:38:22

标签: c++ binding overloading

假设:

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绑定是动态的,据我所知,重载具有静态绑定。 任何人都可以解释一下编译器如何决定在这里调用哪个函数?

3 个答案:

答案 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 ++中,成员函数由其名称及其参数标识。在父节点中不存在的基础中添加重载将不会启用动态调度。