通过引用调用虚函数:调用 derived class' override
calling a virtual function through a reference: derived class' override gets called
我有以下代码:
#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 &
到 "fix" 类型,所以 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。
- Further reading
我有以下代码:
#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 &
到 "fix" 类型,所以 t2
会调用 Parent::f()
。我误解了规则吗?如何解释这一行为?
这就是多态性的作用。
I expected the
Parent &
to "fix" the type, sot2
would callParent::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。
- Further reading