2

如果我正确理解切片,我认为指针或智能指针不会发生这种情况。例如,如果您有:

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;
}

我的理解是分配给“b”指向的对象的内存块仍然是相同的,并且在分配给智能指针“a”时不会改变。

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

4

2 回答 2

6

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

于 2009-10-08T23:21:23.993 回答
2

你是对的,但它们不一样:你不能评估a->stuff.

于 2009-10-08T23:19:44.183 回答