gpt4 book ai didi

c++ - 通过引用 : derived class' override gets called 调用虚函数

转载 作者:行者123 更新时间:2023-11-30 02:39:14 26 4
gpt4 key购买 nike

我有以下代码:

#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() 作为动态绑定(bind)的结果,但第二个让我感到困惑 - 我期望 Parent & 来“修复”类型,因此 t2 将调用 Parent::f()。我误解了规则吗?如何解释这一行为?

最佳答案

这就是多态性的作用。


I expected the Parent & to "fix" the type, so t2 would call Parent::f().

好吧,你想错了。

Am I misunderstanding the rules?

是的。

How does one explain this behavior?

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

需要注意的重要一点是指针(和引用)不会调用多态性。因此,无论您在哪里读到只有指针调用多态性,都是错误的。 多态性由对象访问调用。恰巧,由于the slicing problem , it is impossible to invoke virtual dispatch except through a pointer or reference .

关于c++ - 通过引用 : derived class' override gets called 调用虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30017634/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com