智能指针仍然是指针,因此这样的赋值不会导致切片。切片仅在处理值时发生,而不是指针。但是请注意,模板不知道所指向的项目之间的关系,因此即使 B 派生自 A,shared_pointer<B>
也不会派生自shared_pointer<A>
,因此分配不会(自动)像它那样自动获得向上转换将使用本机指针。
编辑:详细说明最后一点。
切片发生在值上,而不是指针上,所以(鉴于您对 A 和 B 的定义),类似于:
A 轴 = 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; }
};
现在,如果我们尝试将一个值分配给另一个值,则会导致切片:
holder<A> ha;
holder<B> hb;
A a;
B b;
ha = a;
hb = b;
ha = hb;
我们不会切片。相反,编译器会简单地给我们一个错误,告诉我们它holder<A>
和holder<B>
不是相关类型,所以分配不可能发生——如果不添加显式转换,它根本不会编译。