使用对象切片从多个基数之一可靠地复制 类

Using object slicing to reliably copy from one of multiple base classes

我一直在阅读 this answer,其中解释了切片如何只修改对象的一部分。我想知道在危险案例中解释的切片行为是否得到保证或未定义。

给定以下 class 结构(我无法修改):

class Combined : public Data, public Handler  
{  
    // no operator=() defined
    // implements abstract and/or virtual methods from Handler  
    // methods access members from Data  
};  

class Data  
{  
    // no operator=() defined
    // public members and public non-virtual methods only  
};  

class Handler  
{  
    // no operator=() defined
    // contains abstract as well as virtual methods  
    // protected/private members  
};

我能否可靠地使用对象切片来仅分配 CombinedData 部分,例如:

// Declaration
Data returnSomeDataFromSomewhere();

// real work starts here
Combined usable_obj;

Data& sliced_data = usable_obj;
sliced_data = returnSomeDataFromSomewhere();

usable_obj.actOnData();

甚至

Combined usable_obj;
usable_obj.initialise();
usable_obj = returnSomeDataFromSomewhere();
usable_obj.actOnData();

this question 的回答表明显式调用 Combined.Data::operator=(或者是 Combined::Data::operator=?)可以达到同样的效果。它看起来与分配给 Data& 对象相同,但我对打破派生的 class' 不变量的警告感到困惑。

如果切片恰好是未定义的行为,我总是可以创建一个临时 Data 对象并单独复制每个成员,因为它们是 public,但我宁愿不必这样做,如果Data.

中有 200 位成员

但是,如果保证切片行为,是否有任何我应该注意的陷阱?


编辑:添加了对没有 operator=.

的 classes 的限制

我跳。

首先,这不是切片,如评论中所述。

这只是调用基 class 中定义的函数。它是特殊的功能之一,但不是 that 特殊的(不涉及魔法)。默认实现是将右侧对象的成员(即 operator= 的参数)复制到调用成员函数的对象的相应成员,即左侧。据我所知,这在语言方面应该是安全的。 (当然也可能是调用者的这种部分改变在逻辑上是有问题的,因为它违反了Combined的不变量。)