为什么这个方法调用不像我预期的那样是虚拟的?

发布于 2024-09-16 11:50:06 字数 501 浏览 3 评论 0原文

我想问一下,当我使用没有指针的虚函数时会发生什么?例如:

#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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

病毒体 2024-09-23 11:50:06

这种效果称为“切片”。

Parent b = Child(2); // initializes a new Parent object using part of Child obj

在 C++ 中,动态类型可能仅与引用或指针的静态类型不同。你有一个直接的对象。所以,你的怀疑基本上是正确的。

This effect is called "slicing."

Parent b = Child(2); // initializes a new Parent object using part of Child obj

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.

盗梦空间 2024-09-23 11:50:06

请尝试以下操作:

std::auto_ptr<Parent> b = new Child(2);

在代码中,将 Child 对象的一部分复制到 b。这就是所谓的对象切片

Try the following:

std::auto_ptr<Parent> b = new Child(2);

In your code you copy part of Child object to b. This is so called object slicing.

慕巷 2024-09-23 11:50:06

仅当通过适当的引用或适当的指针调用虚拟函数时,才启用虚拟函数机制。请注意,虚函数调用机制在构造函数/析构函数中或使用 :: 运算符时被抑制。

如果代码如下所示,则启用虚函数机制。

Child c;
Parent &a = c;
a.f();

如果没有指针,即使是虚函数调用,调用也是静态绑定的。

编辑2:

$10.3/6 - [注:解释
虚函数的调用取决于
关于它所针对的对象的类型
被称为(动态类型),而
a 的调用的解释
非虚成员函数取决于
仅取决于指针的类型或
表示该对象的引用(
静态类型)(5.2.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.

Child c;
Parent &a = c;
a.f();

Without pointers, the call is statically bound, even if it is a virtual function call.

EDIT 2:

$10.3/6 - [Note: the interpretation of
the call of a virtual function depends
on the type of the object for which it
is called (the dynamic type), whereas
the interpretation of a call of a
nonvirtual member function depends
only on the type of the pointer or
reference denoting that object (the
static type) (5.2.2). ]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文