You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求解Stroustrup《C++程序设计语言》中对象切片示例的困惑

关于《C++程序设计语言》中切片问题示例的解惑

先把原代码里的笔误修正后贴出来:

struct Base {
  int b;
  Base(const Base&);
};

struct Derived {
  int d;
  Derived(const Derived&);
};

void naive(Base* p) {
  Base b2 = *p; // 修正原笔误:B -> Base
};

void user() {
  Derived d;
  naive(&d);
  Base bb = d;
};

这个示例的核心问题是对象切片(Object Slicing),你的判断没错——两种情况都不会完整复制Derived对象,具体要点拆解如下:

  • 第一种场景:naive(&d)调用时,Derived*被隐式转换为Base*,解引用*p得到的是Base&类型。此时用这个引用初始化Base b2,会调用Base的拷贝构造函数,只会复制Derived对象中属于Base的成员(也就是int b),Derived独有的int d会被直接“切掉”,不会被拷贝到b2里。
  • 第二种场景:Base bb = d,这里是用Derived对象直接初始化Base对象,同样触发Base的拷贝构造函数,只复制Base子对象的内容,Derived的d成员完全被忽略。

这个示例的意义就是直观展示对象切片现象:当你用派生类对象以值语义的方式初始化或赋值基类对象时,派生类中超出基类定义的部分会被丢弃,只保留基类对应的子对象。如果想要完整拷贝派生类对象,你需要借助指针、引用,或者设计虚拷贝构造函数这类多态机制来实现。

内容的提问来源于stack exchange,提问作者user722227

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 13:27:11