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



我有以下代码:

#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 &"修复"类型,所以t2会调用Parent::f()。 我是不是误解了规则?如何解释这种行为?

这就是多态性的作用。


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

好吧,你预料错了。

我是不是误解了规则?

是的。

如何解释这种行为?

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

需要注意的重要一点是,指针(和引用)不会调用多态性。因此,无论你在哪里读到只有指针调用多态性都是双重错误的。多态性由对象访问调用。碰巧的是,由于切片问题,除非通过指针或引用,否则无法调用虚拟调度。

  • 延伸阅读

相关内容

  • 没有找到相关文章

最新更新