C++构造函数引用参数为何不会引发对象切片问题咨询
为什么Foo构造函数的参数列表不会出现对象切片?
嘿,这个问题抓得很准!咱们先把对象切片的本质搞清楚,再看为什么这里不会踩坑:
首先,对象切片是什么? 当你用一个派生类对象去值拷贝初始化/赋值给一个基类对象时,派生类独有的成员(比如B里的x)会被“切掉”,最终得到的只是基类部分的副本——这就是切片。
那回到你的代码里的Foo构造函数:
Foo(A &a_) : a(a_) {}
重点就在这个参数A &a_——这是一个基类的左值引用,引用的核心是“别名”,它不会创建新的对象,只是绑定到你传入的那个B b对象本身。
也就是说,当你调用Foo foo(b)时:
a_只是b的另一个名字,它指向的是完整的B对象,没有发生任何对象的拷贝操作- 既然没有创建基类对象的副本,自然就不存在“切掉派生类部分”的情况,也就不会有对象切片问题
反过来,如果构造函数参数是值传递(比如Foo(A a_) : a(a_) {}),那情况就完全不同了:这时候会用b去拷贝构造一个A类型的临时对象,这一步就会触发对象切片,丢掉B里的x和虚函数表的派生类部分。
另外提一句,你的代码里Foo的成员是A a;,但A是抽象类(有纯虚函数doStuff()),其实这段代码是编译不过的——不过既然问题聚焦在构造函数参数的切片问题,咱们就先忽略这个小细节啦。
内容的提问来源于stack exchange,提问作者quetzalfir
相关产品推荐
相关产品推荐

