求解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
相关产品推荐
相关产品推荐

