在这种情况下会有对象切片吗?
Posted
技术标签:
【中文标题】在这种情况下会有对象切片吗?【英文标题】:Will there be object slicing in this case? 【发布时间】:2018-03-15 11:39:58 【问题描述】:给定下一个代码:
class A
// ...
;
class B : public A
// ...
;
还有:
A a;
B b;
A& ab = b;
ab = a;
会在这段代码的最后一行进行切片吗?为什么?
【问题讨论】:
奸诈案 @SmitYcyken 你是什么意思? 【参考方案1】:不会有切片。但是由于引用ab
的静态类型,会调用类A的复制赋值运算符。
考虑以下程序
#include <iostream>
struct A
A & operator =( const A & )
std::cout << "A::operator = is called" << std::endl;
return *this;
;
struct B : A
B & operator =( const B & )
std::cout << "B::operator = is called" << std::endl;
return *this;
;
int main()
A a;
B b;
A &ab = b;
ab = a;
return 0;
它的输出是
A::operator = is called
您不能以引用另一个对象的方式重新分配引用。
【讨论】:
@DevSolar 问题不在于切片是什么。问题是在这个例子中是否会有切片。 @VladfromMoscow 在B
中声明的所有b
成员将复制到ab
?
@StackUser 不会有任何副本。 ab 是对 b 的引用。没有创建任何新对象。
@VladfromMoscow,您复制了一个已经存在的答案。 5 岁的答案:因此,a_ref = b1 行将调用 A 的赋值运算符,而不是 B 的赋值运算符。而你的:由于引用 ab 的静态类型,将调用类 A 的复制赋值运算符。
@SmitYcyken 五年前我不在 SO。:) 我是初学者。以上是关于在这种情况下会有对象切片吗?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在这种情况下会生成不同的 go-assembler 代码?