什么是对象切片?

新手上路,请多包涵

在 C++ 中,什么是对象切片,什么时候发生?

原文由 Frankomania 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
1 个回答

当数据成员被切片时发生对象切片时,我看到所有提到的答案。这里我举一个例子,这些方法没有被覆盖:

 class A{
public:
    virtual void Say(){
        std::cout<<"I am A"<<std::endl;
    }
};

class B: public A{
public:
    void Say() override{
        std::cout<<"I am B"<<std::endl;
    }
};

int main(){
   B b;
   A a1;
   A a2=b;

   b.Say(); // I am B
   a1.Say(); // I am A
   a2.Say(); // I am A   why???
}

B(对象 b)派生自 A(对象 a1 和 a2)。 b 和 a1,如我们所料,调用它们的成员函数。但是从多态性的角度来看,我们不期望由 b 分配的 a2 不会被覆盖。基本上,a2 只保存 b 的 A 类部分,即 C++ 中的对象切片。

为了解决这个问题,应该使用引用或指针

 A& a2=b;
 a2.Say(); // I am B

或者

A* a2 = &b;
a2->Say(); // I am B

原文由 Sorush 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题