我想问当我使用虚拟功能没有指针时会发生什么?例如:

#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;
}

^^为什么不起作用?我在哪里可以找到有关虚拟方法的真正工作方式的信息?

有帮助吗?

解决方案

这种效果称为“切片”。

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

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

其他提示

尝试以下操作:

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

在您的代码中,您复制了一部分 Child 反对 b. 。这就是所谓的 对象切片.

仅当通过适当的参考或适当的指针调用虚拟函数时,才启用虚拟功能机制。请注意,虚拟函数调用机制在构造函数/驱动器中被抑制,或者在使用::操作员时被抑制。

如果代码如下所示,将启用虚拟功能机制。

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

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

编辑2:

$ 10.3/6 - [注意:虚拟函数呼叫的解释取决于其称为对象的类型(动态类型),而非虚拟成员函数的呼叫的解释仅取决于类型指示该对象(静态类型)(5.2.2)的指针或参考。这是给予的

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top