Set*_*eth 2 c++ pointers smart-pointers object-slicing
如果我理解切片正确,我不认为这可能发生指针或智能指针.例如,如果你有:
class A
{
int something;
};
class B : public A
{
int stuff;
int morestuff;
};
int main()
{
std::shared_ptr<B> b(new B());
std::shared_ptr<A> a;
a = b;
}
Run Code Online (Sandbox Code Playgroud)
我的理解是,分配给"b"所指向的对象的内存块仍然相同,并且在分配给智能指针"a"时不会改变.
请确认或拒绝我的理解,或让我知道与此相关的任何陷阱.
智能指针仍然是指针,因此这样的赋值不会导致切片.切片仅在处理值时发生,而不是指针.但是请注意,模板不知道点之间的项之间的关系,所以即使B派生自A,shared_pointer<B>也不是派生的shared_pointer<A>,所以赋值不会(自动)得到像它一样的自动向上转换会用原生指针.
编辑:详细阐述最后一点.
切片发生在值而不是指针上,所以(给定A和B的定义),类似于:
A ax = b;
会工作,但会"切片"B对象成为A对象.但是,如果您拥有某种包含该项目实例的模板:
template <class T>
class holder {
T t_;
public:
holder &operator=(T const &t) {
t_ = t;
return *this;
}
holder &operator=(holder const &t) { t_ = t; return *this; }
};
Run Code Online (Sandbox Code Playgroud)
现在,如果我们尝试将一个值分配给另一个,就像会导致切片一样:
holder<A> ha;
holder<B> hb;
A a;
B b;
ha = a;
hb = b;
ha = hb;
Run Code Online (Sandbox Code Playgroud)
我们不会切片.相反,编译器只会给我们一个错误,告诉我们holder<A>并且holder<B>不是相关类型,因此分配不会发生 - 如果不添加显式转换,它就不会编译.