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

c++ - 堆栈对象的动态转换失败

前几天我遇到了一个实例,其中我有一个函数获取一个指向基类型的指针,然后我需要将其向上转换为派生类型以访问一些附加功能。但是,dynamic_cast失败了,这很奇怪,因为我的类型肯定继承了基本类型。

为了深入了解发生了什么,我创建了以下测试程序,我认为它复制了我所看到的:

这很有趣,因为如果您只看到我调用的方法cast(),您会期望可以转换传入的对象。我已经证明不是这种情况;这取决于最初创建对象的方式。令人困惑的是,为什么可以强制转换一个通过引用而不是值重新分配的对象。此外,static_cast只要我们保证类型兼容,使用会起作用吗?

0 投票
2 回答
247 浏览

c++ - 多于一种类型的对象的集合

是否有任何非糟糕的方式来收集不止一种类型的对象?我很高兴从一个共同的基础中派生出每种类型。我需要合理的语义,以便可以复制、分配集合等。

显然,我不能只使用基类的向量或列表。对象将被切片,复制根本不起作用。使用向量或指针列表或智能指针是可行的,但您不会获得健全的复制语义。

要获得健全的复制语义,您需要使用类似 Boost 的ptr_vector. 但这需要一个痛苦且容易出错的基础架构。本质上,您不能只从基类派生一个新类,因为如果它进入集合,它将不会被正确复制。

这似乎是一件很常见的事情,我所知道的所有解决方案都非常糟糕。似乎 C++ 从根本上缺少一种方法来创建与给定实例相同的对象的新实例——即使该类型具有复制构造函数。并且制作一个cloneorduplicate函数需要在每个派生类中仔细重载。如果在创建从基类(或从该基类派生的任何其他类)派生的新类时未能做到这一点 - 繁荣,您的集合会中断。

真的没有更好的办法吗?

0 投票
1 回答
832 浏览

c++ - 尽管切片,为什么 static_cast 仍然可以使用空指针?

如果我们使用多重继承,切片将使父对象的地址与叶对象的地址不同:

所以如果我们有一个Z对象z,它的地址&z不会和它Y父地址重合:static_cast<Y*>(&z)比 . 高四个字节&z

好处static_cast是它是静态的,所以不占用运行时间(与 相比dynamic_cast)。但是,如果我们有一个Z*指向 的0,那么每个对父级的强制转换也应该并且确实会产生一个空指针。为什么这个工作以及它是如何实施的?这是否意味着每一个都static_cast引入了一个分支指令?

0 投票
5 回答
3917 浏览

c++ - 多态性是否在没有指针/引用的 C++ 中工作?

可能重复:
虚拟功能对象切片

让我们考虑一下:

哪个函数会被调用?如果不存在切片,基本上是否可以在没有指针的情况下使用多态性?

0 投票
3 回答
4294 浏览

c++ - c ++:向量可以包含派生类型的对象吗?

标题基本概括了所有内容。基本上,这样做是否合法:

根据我看到的其他帖子,以下是可以的,但我不想在这种情况下使用指针,因为它更难使其线程安全。

0 投票
2 回答
399 浏览

c++ - C++ 切片的潜在解决方法?

我有一个 C++ 切片问题。我是 C++ 的新手,所以可能太笨了,无法意识到这无法完成....我尝试了各种解决方法,我目前的最佳方法如下所示。(我需要做这样的事情来避免在非常大的遗留代码库中更改大量接口。无论如何不要声称这是优雅的风格!!)

编译时遇到麻烦。这个想法合理吗?还是整个方法注定要失败?引用的构造函数似乎是问题所在。我已经阅读了 Stroustrup 的“C++ Programming Language”(或者至少我认为是相关部分),但它没有帮助。

编译器不喜欢我的_realFoo(&_foo)行。我希望对_foo, 的引用只是类中成员变量的引用。这在 C++ 中是不可能的吗?

这是来自 VS2005 的具体错误:

0 投票
3 回答
640 浏览

c++ - C++ 切片导致泄漏/未定义行为/崩溃

是否有任何 C++ 对象切片效果的示例可能导致未定义的行为、内存泄漏或在其他正确的代码集中崩溃?例如,当 classAB(继承自A)是正确且合理的,但调用 avoid f(A a)显然会导致讨厌的事情。

它是形成测试问题所必需的。目标是使用示例代码片段了解参与者是否意识到切片现象,该示例代码片段的正确性绝不能是意见问题。

0 投票
2 回答
1968 浏览

c++ - 来自 Deconstructor 的调试断言失败 BLOCK_TYPE_IS_VALID(pHead->nblockuse)

我现在很迷茫。我做了一个矢量类。一切都按照我希望的方式工作,直到最后。当调用析构函数时,我收到一条错误消息:调试断言失败 BLOCK_TYPE_IS_VALID(pHead->nblockuse)。我在 SO 上看到过很多类似这样的问题,但是我尝试过的方法没有奏效。

.h 的一部分

0 投票
3 回答
108 浏览

c++ - 如何使子方法被调用:虚拟关键字不起作用?

以下是我的代码,

当我运行代码时,会调用基类的方法('test')。但我希望调用 child 的方法,因为我将方法指定为虚函数。

那我怎样才能调用子类的方法呢?谢谢你。

0 投票
3 回答
108 浏览

c++ - 允许 operator= 仅在同一类的对象之间使用?

我有一个类层次结构,我想禁止这样做:

Foo的超类在哪里Bar。这样做会切开Bar对象的一部分。我知道您可以通过将operator=其设为私有来解决此问题,但是是否可以仅禁止使用不同类型的赋值运算符?

就像operator=私有化但仍然允许这样做:

假设子类也将被制作Bar