通过引用调用虚函数:派生类'覆盖被调用

时间:2015-05-03 18:20:50

标签: c++ polymorphism dynamic-binding

我有以下代码:

#include <iostream>
using namespace std;

class Parent {
public:
    virtual void f() { cout << "Parent" << endl; }
};

class Child : public Parent {
public:
    void f() { cout << "Child" << endl; }
};

void t1(Parent * p) { p->f(); }
void t2(Parent & p) { p.f(); }

int main() {
    Child a;

    t1(&a);
    t2(a);

    return 0;
}

我在Visual Studio 2013和ideone.com中对此进行了测试,结果都得到了结果:

Child
Child

我可以理解t1调用Child::f()作为动态绑定的结果,但第二个让我感到困惑 - 我期待Parent &到&#34;修复&#34;类型,因此t2会调用Parent::f()。我误解了规则吗?如何解释这种行为?

1 个答案:

答案 0 :(得分:3)

这就是多态性的作用。

  

我希望Parent &能够“修复”该类型,因此t2会调用Parent::f()

嗯,你预料错了。

  

我误解了规则吗?

  

如何解释这种行为?

通过阅读一本关于C ++的书并阅读关于多态的章节 您的Parent&就像Parent*一样:通过允许虚拟调度

需要注意的重要一点是指针(和引用)不会调用多态。因此,无论你在哪里阅读,只有指针调用多态性是双重错误。 通过对象访问调用多态性。由于the slicing problem it is impossible to invoke virtual dispatch except through a pointer or reference而发生这种情况。