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

C++继承问题:无指针场景下直接将子类对象赋值给父类的疑问

两种写法的核心差异

1. A ac = *b:值拷贝 + 对象切片

这行代码会触发A类的拷贝构造函数,创建一个全新的独立A类对象。拷贝过程只会复制*b(B类实例)中属于父类A的成员(也就是示例中的int i),如果子类B有自定义的新增成员,这些内容都会被截断丢弃,也就是C++中的「对象切片」现象。
此时ac和原b指向的B类对象是完全独立的两块内存,修改ac的任何属性都不会影响原b对象,和指针赋值的地址传递逻辑完全不同。

2. A &ac = *b:引用绑定,无对象拷贝

这行代码不会创建新对象,这里的ac是原*b对象中父类A部分的别名,二者共享同一块内存。你对ac的所有操作都会直接作用到原b指向的B类对象上,逻辑和父类指针指向子类对象一致,不会发生对象切片。


声明语句中&的作用

C++中&在不同语法位置的作用完全不同:

  • 当&跟在类型标识符之后时,作用是声明引用:例如int& ref = a、A& ac = *b,引用本质是变量的别名,和被绑定的变量共享同一块内存,不会产生拷贝开销。你提到的「按引用传递」就是引用的典型应用场景:函数参数声明为引用类型时,形参是实参的别名,既可以避免参数拷贝,也可以通过形参直接修改实参的值。
  • 当&放在变量/对象之前时,作用是取地址运算符:例如A* a = &ac,作用是获取目标对象的内存地址,赋值给对应类型的指针。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:15:03