问题标签 [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 投票
2 回答
230 浏览

c++ - 在继承的对象中切片

以下案例指出了切片问题: 在分配期间: https ://stackoverflow.com/a/274634/640639

在函数调用期间: 什么是对象切片?

我的问题是,如果将赋值运算符和复制构造函数声明为虚拟并且派生类适当地复制所需的数据,这两种情况都不会得到解决吗?如果原则上是这样,在这些情况下传递值应该仍然有效,对吗?

0 投票
3 回答
3778 浏览

c++ - 在 C++ 中创建一个超类类型的数组来动态存储子类对象

请考虑以下代码:

如您所见,我想创建对父类的引用的动态分配存储,然后每个父类都可以指向子类,但是我不知道如何从该数组中再次提取子类,因此我可以访问它变量 b;

我尝试了以下方法,但它们对我不起作用并给出错误“从'超类*'转换为非标量类型'子类'请求”和“从'超类*'转换为非标量类型'subclass2'请求”

我确定我错过了一些小东西。

PS:我找不到类似的问题,但如果存在,请重定向我,我也想要一个不需要我使用向量或任何内置的预先存在的库类的解决方案。

0 投票
2 回答
410 浏览

c++ - 不执行派生类版本的虚函数

我有一组要流出的 SceneElement。这是聚合类:

这是基类:

这是派生类之一:

但是当我运行这段代码时:

它显示

而不是它应该的实际元素。

0 投票
1 回答
494 浏览

c++ - 显式切片派生对象

我为我的公司构建的项目有一些类结构。在某些时候,我已经看到派生对象的“通常不需要的”切片实际上可以使我的代码高效。请注意:

现在,如果 Derived 处的 someTest() 失败,这表明我的对象实际上是基本类型 (myType = 1) 或错误对象 (myType =0)。由于这些东西在构造函数中,并且由于我不能使用异常处理(嵌入式系统);我想到了这个:

现在,我为什么会有这样的设计?好吧,在我设计类时,由于“基础”(类型 1)和“派生”(类型 2)类的内部工作方法不同(并且有可能是 3、4、5 类型......内部也不同的对象)并且因为我不想在每个方法中都进行“if-then-else”检查;我想我会做出这样的设计并使不同的方法虚拟化,以便可以正确调用它们(感谢多态性),而常用方法可以在某个基类中。

但是现在,首先,我不确定那个奇怪的语法( & static_cast < Base > *deriv )是否正确(经过测试,似乎可以工作,但我只是想确保这不是因为运气);其次,我不确定这是否是实现这一目标的“建议方法” - 我有点怀疑这种语法会导致内存泄漏或其他什么......

稍微更改了代码(也更正了语法)以使问题更清晰。

现在,由于 &(static_cast(*deriv)) 是一种错误的方法,我在想我是否可以创建一个“复制构造函数”来绕过基类的检查(这实际上是我尝试这些东西的原因 - 我不'不希望在某些情况下运行该测试)。如下所示:

写完这篇文章,我想我现在可以在测试块上做到这一点:

那这个呢?

0 投票
2 回答
70 浏览

c++ - 用于创建库的标头是否必须与使用该库的标头相同

在将源代码编译为 .o 文件并使用“ar rcs libMyLibrarylib.a *.o”创建库后,我遇到了段错误,因为我使用的是带有成员变量和私有函数的头文件。当我使用完全相同的标题时,我没有得到错误。删除地图中的指针时会发生段错误。

用于创建库的标头

与编译库一起使用的头文件

不使用确切的头文件时是否有切片或其他东西?我想对使用该库的任何人隐藏类型的#include。

我对该库进行了单元测试,它没有段错误,但它使用与编译它相同的头文件。

0 投票
2 回答
562 浏览

c++ - c++对象工厂函数

假设我有以下数据结构:

我想创建一个返回派生类向量的单一工厂方法,其中 id、名称和类别在函数中是已知的。我遇到的问题是切片......

结构 A 的数据成员丢失了!(dynamic_cast 回 A 在生产代码中可以接受?)

所以我有这个模板方法,但我仍然认为它不是最好的解决方案:

除了模板方法,还有更好的解决方案吗?

0 投票
2 回答
137 浏览

c++ - 使用队列进行对象切片

使用带有 -std=c++0x 的 Eclipse/gcc 在 Ubuntu 上进行开发。

我似乎遇到了对象切片问题,这不属于我在这里看到的其他问题。我有一个非常简单的基类/子类继承模型。基类有一个纯虚函数,显然子类实现了它:

我想要的是有一个队列,我可以在其中存储这些对象以供工作线程处理。我知道我应该存储指针,否则我会保证切片。因此,在执行此操作的类(“处理器”)中,我有:

然后发生的是程序崩溃,说“调用了纯虚拟方法”,就好像继承/多态不能正常工作一样。我知道继承设置正确,因为当我测试时我确认这是有效的:

非常感谢任何指导!

0 投票
2 回答
703 浏览

c++ - 对象切片有用吗?

当我们将派生类的对象分配或复制到其基类的对象时,就会发生对象切片,在此过程中会丢失它的派生部分。

此处已对其进行了更深入的解释:C++ 中的切片问题是什么?.

(我自己,我不认为这是一个问题,而是语言价值语义的自然结果,但这不是这个问题的重点。)

我想知道的是:是否有过故意使用它的情况?它是“适合工作的工具”的情况?

0 投票
1 回答
160 浏览

c++ - 转换运算符正在切片我的对象

我从以下代码中得到了意外的行为:

使用 MSVC2008,我在 main() 中得到这个编译错误:

为什么它试图访问 Base 的复制构造函数?

如果我公开 Base 的复制构造函数,代码会在运行时编译并切片返回值,并且在 func() 中对 foo() 的调用会触发一个名为 error 的纯虚函数。

有人可以解释一下吗?

0 投票
2 回答
3077 浏览

c++ - 指针和对象切片

我正在学习有关对象切片的艰难方法,并且我想知道指针是否有可能被对象切片。换句话说:

  • 指针是否会成为对象切片的受害者,或者只要您使用指针,您是否总是可以免受对象切片的影响?