问题标签 [object-slicing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
173 浏览

c++ - 在派生类和切片中使用运算符 = 的正确方法

所以我有一个基类有一个私有成员和一个派生类也有一些成员,基类定义了一个运算符=,这是我的问题:

这是正确的方法还是有更好的方法?我是否在此过程中进行任何切片?

我知道这不是一个完美的代码,但我只是为这个问题写了一个简单的代码。

0 投票
2 回答
1910 浏览

c++ - 防止在复制构造函数中切片

我想复制一个 Foo 对象类型的向量,但这些对象可以是 Foo 的几种不同派生类型。我无法弄清楚如何在不切片的情况下进行复制。这是我的玩具代码

我不能指定类型应该是 FooDerivedA 像:

因为它可能是 FooDeriveddB。如何在不切片的情况下复制数据?

0 投票
1 回答
91 浏览

c++ - 为什么切片非根基类会产生正确答案?

我的代码中有一个案例,我想使用对象切片,但我正在尝试确定这样做是否安全或聪明。为了确定这一点,我运行了以下示例:

我期待它返回 1,因为基类不是最顶层(根),但它显示 3。所以,我的问题是它为什么/如何显示正确答案,这是一种安全的做法吗?如果任何一个类有虚拟表,你的答案会有什么变化?如果您认为它不安全,您是否有任何解决方法可以从派生对象复制非根基础对象?

我使用以下命令在 gcc 4.6.3 下的 linux 中运行它:

0 投票
1 回答
110 浏览

c++ - C++ 是否保证派生对象数据在基础对象 std::swap 之后有效?

这样做是否安全:

此时是否保证派生的信息 dy 仍然有效?换句话说,我只是在交换基础对象,但派生数据仍然有效,对吗?另外,这被认为是切片吗?

编辑:在评论中指出这不会编译。将 d 中的基础数据与 b 交换的最佳方法是什么?请记住,b 显然比我在示例中提出的要复杂得多。

0 投票
1 回答
264 浏览

c++ - `auto x = f()` 是否比 `T x = f()` 更好?

在另一个主题中有人建议使用

代替

(如果 的签名fT f())。他们指出,如果有人碰巧更改f为从U f()哪里U下降,这可以防止无声的对象切片T

这对我来说很有意义,但我可能还缺少其他的东西。那么,哪个更好,为什么?

0 投票
2 回答
890 浏览

c++ - 复制指针向量而不切片

我需要复制多态对象的向量,在新向量中应该有指向相同多态类型的指针,只是不指向相同的数据,而是它们应该指向堆上的新数据。该数据需要设置为与原始向量相同的数据。

例子

在这种情况下,新的向量实体只是从 baseEntity 获取指针。这里不会发生切片,但是当我更改 baseEntity 中的指针时,它也会更改实体中的数据。如何根据我的情况正确复制它?

0 投票
1 回答
332 浏览

c++ - 私有继承中的对象切片

为什么对象切片不会发生在私有继承中?Static_cast 在这种情况下会出错吗?我了解私有继承在其继承类之间不存在“is - a”关系。这是否与切片有关,因为 derived 不是 base 类型,所以编译器强制不进行隐式转换?

0 投票
3 回答
92 浏览

c++ - 构造函数调用子类

我有一个(部分实现的)类层次结构,其中

现在在我的其余代码中,我希望能够从某物是 jpeg 图像还是图像中抽象出来,所以我想使用data. 但同时我想将特定于 jpeg 图像的命令传递给这些函数。

因此,如果我调用data<int> img("lena.jpg");的结果是图像,甚至是 jpeg 图像,我希望数据构造函数调用图像构造函数,而图像构造函数又调用 jpgimage 构造函数。

我无法让它工作,人们警告切片、虚拟构造函数等。但这是一种奇怪的设置方式吗?

0 投票
4 回答
669 浏览

c++ - 将虚拟方法放在可复制类型上是否是个好主意?

看过一些相关的问题,但不是这个确切的问题......

我已经将类视为适合几个主要类别,为了简单起见,让我们说这四个:

  • 具有一些数据和一堆操作的值类。它们可以被复制并有意义地比较是否相等(通过 预期副本相等==)。 这些几乎总是缺少虚拟方法。

  • 其实例具有您禁用分配和复制的标识的唯一类。通常没有operator==这些,因为您将它们作为指针而不是对象进行比较。 这些通常有很多虚拟方法,因为不存在的风险,因为您被迫通过指针或引用传递它们。

  • Unique-but-Clonable Classes禁用复制,但如果这是您真正想要的,则预先设计为支持克隆。 这些具有虚拟方法,最重要的是那些遵循虚拟构造/克隆习语的方法

  • 容器类继承了它们所持有的任何东西的属性。 这些往往没有虚拟方法......例如,请参阅“为什么 STL 容器没有虚拟析构函数?” .

不管持有这种非正式的信念系统,有几次我尝试将虚拟方法添加到可复制的东西上。虽然我可能认为它“如果有效的话会很酷”,但它不可避免地会坏掉。

这让我想知道是否有人有一个具有虚拟方法且不禁用复制的类型的实际好例子?

0 投票
2 回答
405 浏览

c++ - 删除指向 Derived 对象的 Base 指针

这会起作用,还是会进行切片(即仅释放与 Base 对象占用的内存相对应的内存,而不是释放整个 Derived 对象):

如果没有,会这样吗?