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

yPr*_*mer 2 c++ object-slicing

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

^^为什么不起作用?我在哪里可以找到有关虚拟方法如何工作的内容?

Pot*_*ter 14

这种效果称为"切片".

Parent b = Child(2); // initializes a new Parent object using part of Child obj
Run Code Online (Sandbox Code Playgroud)

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

  • 这种情况越来越疯狂,但这并不是一个很好的答案.基里尔提供了一个参考,看看. (4认同)