智能指针是否可以进行切片?

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"时不会改变.

请确认或拒绝我的理解,或让我知道与此相关的任何陷阱.

Jer*_*fin 6

智能指针仍然是指针,因此这样的赋值不会导致切片.切片仅在处理值时发生,而不是指针.但是请注意,模板不知道点之间的项之间的关系,所以即使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>不是相关类型,因此分配不会发生 - 如果不添加显式转换,它就不会编译.