问题标签 [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.
c++ - 堆栈对象的动态转换失败
前几天我遇到了一个实例,其中我有一个函数获取一个指向基类型的指针,然后我需要将其向上转换为派生类型以访问一些附加功能。但是,dynamic_cast
失败了,这很奇怪,因为我的类型肯定继承了基本类型。
为了深入了解发生了什么,我创建了以下测试程序,我认为它复制了我所看到的:
这很有趣,因为如果您只看到我调用的方法cast()
,您会期望可以转换传入的对象。我已经证明不是这种情况;这取决于最初创建对象的方式。令人困惑的是,为什么可以强制转换一个通过引用而不是值重新分配的对象。此外,static_cast
只要我们保证类型兼容,使用会起作用吗?
c++ - 多于一种类型的对象的集合
是否有任何非糟糕的方式来收集不止一种类型的对象?我很高兴从一个共同的基础中派生出每种类型。我需要合理的语义,以便可以复制、分配集合等。
显然,我不能只使用基类的向量或列表。对象将被切片,复制根本不起作用。使用向量或指针列表或智能指针是可行的,但您不会获得健全的复制语义。
要获得健全的复制语义,您需要使用类似 Boost 的ptr_vector
. 但这需要一个痛苦且容易出错的基础架构。本质上,您不能只从基类派生一个新类,因为如果它进入集合,它将不会被正确复制。
这似乎是一件很常见的事情,我所知道的所有解决方案都非常糟糕。似乎 C++ 从根本上缺少一种方法来创建与给定实例相同的对象的新实例——即使该类型具有复制构造函数。并且制作一个clone
orduplicate
函数需要在每个派生类中仔细重载。如果在创建从基类(或从该基类派生的任何其他类)派生的新类时未能做到这一点 - 繁荣,您的集合会中断。
真的没有更好的办法吗?
c++ - 尽管切片,为什么 static_cast 仍然可以使用空指针?
如果我们使用多重继承,切片将使父对象的地址与叶对象的地址不同:
所以如果我们有一个Z
对象z
,它的地址&z
不会和它的Y
父地址重合:static_cast<Y*>(&z)
比 . 高四个字节&z
。
好处static_cast
是它是静态的,所以不占用运行时间(与 相比dynamic_cast
)。但是,如果我们有一个Z*
指向 的0
,那么每个对父级的强制转换也应该并且确实会产生一个空指针。为什么这个工作以及它是如何实施的?这是否意味着每一个都static_cast
引入了一个分支指令?
c++ - c ++:向量可以 包含派生类型的对象吗?
标题基本概括了所有内容。基本上,这样做是否合法:
根据我看到的其他帖子,以下是可以的,但我不想在这种情况下使用指针,因为它更难使其线程安全。
c++ - C++ 切片的潜在解决方法?
我有一个 C++ 切片问题。我是 C++ 的新手,所以可能太笨了,无法意识到这无法完成....我尝试了各种解决方法,我目前的最佳方法如下所示。(我需要做这样的事情来避免在非常大的遗留代码库中更改大量接口。无论如何不要声称这是优雅的风格!!)
编译时遇到麻烦。这个想法合理吗?还是整个方法注定要失败?引用的构造函数似乎是问题所在。我已经阅读了 Stroustrup 的“C++ Programming Language”(或者至少我认为是相关部分),但它没有帮助。
编译器不喜欢我的_realFoo(&_foo)
行。我希望对_foo
, 的引用只是类中成员变量的引用。这在 C++ 中是不可能的吗?
这是来自 VS2005 的具体错误:
c++ - C++ 切片导致泄漏/未定义行为/崩溃
是否有任何 C++ 对象切片效果的示例可能导致未定义的行为、内存泄漏或在其他正确的代码集中崩溃?例如,当 classA
和B
(继承自A
)是正确且合理的,但调用 avoid f(A a)
显然会导致讨厌的事情。
它是形成测试问题所必需的。目标是使用示例代码片段了解参与者是否意识到切片现象,该示例代码片段的正确性绝不能是意见问题。
c++ - 来自 Deconstructor 的调试断言失败 BLOCK_TYPE_IS_VALID(pHead->nblockuse)
我现在很迷茫。我做了一个矢量类。一切都按照我希望的方式工作,直到最后。当调用析构函数时,我收到一条错误消息:调试断言失败 BLOCK_TYPE_IS_VALID(pHead->nblockuse)。我在 SO 上看到过很多类似这样的问题,但是我尝试过的方法没有奏效。
.h 的一部分
c++ - 如何使子方法被调用:虚拟关键字不起作用?
以下是我的代码,
当我运行代码时,会调用基类的方法('test')。但我希望调用 child 的方法,因为我将方法指定为虚函数。
那我怎样才能调用子类的方法呢?谢谢你。
c++ - 允许 operator= 仅在同一类的对象之间使用?
我有一个类层次结构,我想禁止这样做:
Foo
的超类在哪里Bar
。这样做会切开Bar
对象的一部分。我知道您可以通过将operator=
其设为私有来解决此问题,但是是否可以仅禁止使用不同类型的赋值运算符?
就像operator=
私有化但仍然允许这样做:
假设子类也将被制作Bar
。