问题标签 [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 回答
662 浏览

c++ - 缺少复制构造函数与对象切片有何关系?

警告:这不是什么是对象切片?,我已经阅读了它并没有澄清我的问题


我的问题是:为什么在对象切片的基类中缺少复制构造函数是一个问题?如果我做类似的事情

这首先是一个经典的切片问题!我不明白为什么或如何在 Base 中定义用户定义的复制构造函数会有所帮助

编辑:我问这个是因为这些答案:https ://stackoverflow.com/a/26040064/1938163和https://stackoverflow.com/a/26040050/1938163似乎暗示我需要定义/默认复制构造函数处理对象切片

0 投票
1 回答
771 浏览

c++ - unique_ptr 会发生切片吗?

我有一个切片的指针,但我不知道在哪里以及为什么。我认为有两行代码可能会导致拼接:

唯一指针的创建:

并从我的唯一指针返回原始指针:

注意:

  • ChildA 类继承 Base
  • Base 有一个虚拟析构函数
  • 上例中的地图类型为:

    /li>

拼接是否发生在上述任一代码行中?有没有一种简单的方法可以避免它在哪里?

0 投票
2 回答
125 浏览

c++ - 为什么会发生切片?

请考虑以下代码:

众所周知,在这种情况下,会发生“切片”:在 C++ 中,我们不能将基类型的变量分配给派生类型的对象;该对象将被“切割”掉任何未在基本类型中定义的东西。(如果我们想做这样的事情,我们必须使用指针或引用)。

我想了解这件事的真正原因。即,Base变量不能在Derived不切片的情况下保存对象的原因。

我的假设是,这样做的原因是Base对象和Derived对象的大小可能不同,因此我们不能保证能够将整个Derived对象存储在Base变量中。ABase可能占用 4 个字节,而 aDerived是 7 个字节。所以我们决定总是对派生对象进行切片以适应基本类型的大小。

我们可以使用指针来做到这一点,因为它们都占用相同数量的内存。

这个假设正确吗?如果不是,那么切片的实际原因是什么?

0 投票
2 回答
117 浏览

c++ - Vector内的类切片

我相信我有一个切片问题,我不知道如何解决它。我已将我实际程序中的问题总结为下面的示例。

输出是Using Base :(但我预期的Using First_Derived!。我认为问题在于,一旦First_Derived对象存储在Base_Objects向量中,它就会失去其独特的Use()功能,因为它正在转换为Base类型?有针对这个的解决方法吗?我尝试应用什么是对象切片?但我不相信我正确地应用它们。

0 投票
2 回答
204 浏览

c++ - c ++多态性,派生类的名称解析

-C++ 不支持逆变返回类型,因此 f(int) 不会覆盖 f(float)

-C++ 支持多态,因此 d 和 b 都应该指向派生类的 vtable。

派生类的 -vtable 类似于 0: f(float), 1: f(int) 等。

我对这个问题的回答是 Base::f(float) 被调用了两次,但答案是:

基数::f(float) 派生::f(int)

为什么会这样?从不同的指针访问派生类是否强制执行某些规则?据我所知,对象切片仅在使用 copy-ctor 或 copy-assignment 时发生,带有指针,它们都应该指向同一个 vtable。

0 投票
3 回答
844 浏览

c++ - C++ 中的切片和运算符重载

背景资料

我已经用 Java 编程了一段时间,几个月前我才切换到 C++,所以如果答案只是我错过的一些愚蠢的事情,我深表歉意!既然都说了这么多,是时候讨论手头的问题了!我正在开发一个基本的基于文​​本的游戏引擎,最近我遇到了一个有趣的具体且不太可能出现的问题。我尝试在下面的程序中以较小的规模对其进行测试,并决定仅显示(与我的实际游戏代码相反),以免阻塞屏幕,并使问题不那么复杂。下面建模的问题反映了我的实际代码的问题,只是没有蓬松的干扰。

问题

本质上,问题是多态性之一。我想重载输出运算符“<<”以用作层次结构中每个对象唯一的显示函数。问题是,当我从存储这些层次结构成员的列表中调用此运算符时,它们会失去身份并调用基类的输出运算符。通常,可以通过用简单的显示方法替换运算符重载,将显示方法标记为虚拟,然后继续他们的快乐日子来解决这个问题。我并不特别介意对代码进行更改,但现在我只是很好奇。有没有办法在层次结构中重载运算符,导致我在这里做什么?

[示例] 代码

[示例] 代码的输出

[示例] 代码的所需输出

0 投票
2 回答
284 浏览

c++ - 使用 std::enable_if 时的对象切片

std::enable_if如果其中一个子类定义了特定的成员函数,我正在尝试使用它来专门化一个类。否则,它应该使用在基类中定义的默认实现。

我本来希望这会打印

但是相反,我得到

所以看起来正在发生一些对象切片。我一生都无法理解为什么会这样,如果有人可以帮助我,将不胜感激。

如果它有任何帮助,那么它正在使用 g++ 4.7.2 进行编译

0 投票
2 回答
68 浏览

c++ - 调用子方法

在我的 C++ 项目中,我有一个名为 Trap 的类。陷阱是 NPC,NPC 是实体。现在我想遍历所有 NPC 并与他们一起做事。例如,我想要更新 Trap。我通过以下方式做到这一点。

但现在 Update() 调用正在调用 NPC::Update() 方法。

我相信这是因为我使用迭代器的方式,但我不知道如何更好地做到这一点。使用不同类型的迭代?有一个简单的技巧吗?

0 投票
1 回答
133 浏览

python - numpy 获取二维数组,其中最后一个维度根据二维数组进行索引

我确实阅读了 numpy indexing,但没有找到我想要的东西。

我有一个 288*384 的图像,其中每个像素都可以在 [0,15] 中有一个标签。它存储在一个 3d (288,384,16) 形的 numpy 数组im中。

im[:,:,1]例如,我可以获取所有像素都带有标签 1 的图像。

我有另一个二维数组labelling,(288*384) 形,包含每个像素的标签。

如何使用一些巧妙的切片获得每个像素具有相应像素的图像?

使用循环,那将是:

但这当然是低效的。

0 投票
1 回答
68 浏览

c++ - c ++调用基类方法切片对象

我有这样的事情:

编译并执行它,你将拥有:

我相信这是因为对象在投射到 A 时被切片。我怎样才能避免这种情况,所以我得到

没有在 B 中实现该方法或使用一些奇怪的东西,比如Curiously recurring 模板模式