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

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”时不会更改。

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

有帮助吗?

解决方案

智能指针仍然是指针,因此这样的作业不会导致切片。切片仅在处理价值(而不是指针)时发生。但是请注意,模板不知道该点的项目之间的关系,因此,即使B源自A, shared_pointer<B> 没有衍生 shared_pointer<A>, ,因此分配不会(自动)像本机指针那样获得自动上的铸造。

编辑:详细说明最后一点。

切片是用价值观而不是指针发生的,因此(考虑到您对A和B的定义),类似:

a ax = b;

会起作用,但会“切片” B对象成为一个对象。但是,如果您有某种模板包含该项目的实例:

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> 不是相关的类型,因此不会发生分配 - 如果不添加明确的铸件,它就不会编译。

其他提示

你是正确的,但它们不一样:您无法评估 a->stuff.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top