使用对象切片从多个基数之一可靠地复制 类
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
};
我能否可靠地使用对象切片来仅分配 Combined
的 Data
部分,例如:
// 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
的不变量。)
我一直在阅读 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
};
我能否可靠地使用对象切片来仅分配 Combined
的 Data
部分,例如:
// 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
.
但是,如果保证切片行为,是否有任何我应该注意的陷阱?
编辑:添加了对没有 operator=
.
我跳。
首先,这不是切片,如评论中所述。
这只是调用基 class 中定义的函数。它是特殊的功能之一,但不是 that 特殊的(不涉及魔法)。默认实现是将右侧对象的成员(即 operator=
的参数)复制到调用成员函数的对象的相应成员,即左侧。据我所知,这在语言方面应该是安全的。 (当然也可能是调用者的这种部分改变在逻辑上是有问题的,因为它违反了Combined
的不变量。)