gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:19:59 26 4
gpt4 key购买 nike

我一直在读this answer这解释了切片如何只修改对象的一部分。我想知道在危险案例中解释的切片行为是有保证的还是未定义的。

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

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& 对象相同,但我对破坏派生类的不变性的警告感到困惑。

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

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


编辑:添加了对没有operator= 的类的限制。

最佳答案

我会跳。

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

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

关于c++ - 使用对象切片从多个基类之一可靠地复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40890346/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com