为什么这个方法调用不像我预期的那样是虚拟的?
我想问一下,当我使用没有指针的虚函数时会发生什么?例如:
#include <iostream>
using namespace std;
class Parent
{
public:
Parent(int i) { }
virtual void f() { cout<<"Parent"<<endl; }
};
class Child : public Parent
{
public:
Child(int i) : Parent(i) { }
virtual void f() { Parent::f(); cout<<" Child"<<endl; }
};
int main()
{
Parent a(2);
Parent b = Child(2);
a.f();
b.f();
return 0;
}
^^ 为什么它不起作用? 我在哪里可以找到有关虚拟方法实际工作原理的信息?
I want to ask what happen, when I use virtual functions without pointers ? for example:
#include <iostream>
using namespace std;
class Parent
{
public:
Parent(int i) { }
virtual void f() { cout<<"Parent"<<endl; }
};
class Child : public Parent
{
public:
Child(int i) : Parent(i) { }
virtual void f() { Parent::f(); cout<<" Child"<<endl; }
};
int main()
{
Parent a(2);
Parent b = Child(2);
a.f();
b.f();
return 0;
}
^^ Why doesn't it work ?
Where can I find something about how virtual methods really work?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这种效果称为“切片”。
在 C++ 中,动态类型可能仅与引用或指针的静态类型不同。你有一个直接的对象。所以,你的怀疑基本上是正确的。
This effect is called "slicing."
In C++, the dynamic type may only differ from the static type for references or pointers. You have a direct object. So, your suspicion was essentially correct.
请尝试以下操作:
在代码中,将
Child
对象的一部分复制到b
。这就是所谓的对象切片。Try the following:
In your code you copy part of
Child
object tob
. This is so called object slicing.仅当通过适当的引用或适当的指针调用虚拟函数时,才启用虚拟函数机制。请注意,虚函数调用机制在构造函数/析构函数中或使用 :: 运算符时被抑制。
如果代码如下所示,则启用虚函数机制。
如果没有指针,即使是虚函数调用,调用也是静态绑定的。
编辑2:
Virtual function mechanism is enabled only if the virtual function is called through either an appropriate reference or an appropriate pointer. Note that virtual function call mechanism is suppressed in constructor/destructor or while using the :: operator.
If the code is as shown below, virtual function mechanism will be enabled.
Without pointers, the call is statically bound, even if it is a virtual function call.
EDIT 2: