问题标签 [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++ - 为什么这个方法不像我期望的那样调用 virtual ?
我想问一下,当我使用没有指针的虚函数时会发生什么?例如:
^^ 为什么它不起作用?我在哪里可以找到有关虚拟方法如何真正工作的信息?
c++ - 在基向量的元素上调用派生方法(给出示例)
假设我有以下类结构。我希望能够确定我的 Animal 向量中的元素是什么类类型,以便我可以对其执行特定于子类的方法。下面的示例应演示:
显然标记的代码不起作用,但是我该怎么做呢?是否有我应该遵循但不是的解决方法或设计原则?我已经研究了 dynamic_cast 但明白这很不漂亮。那么我应该如何正确地做到这一点呢?
在 Java 中,我会这样做:
c++ - 学习 C++:返回引用并绕过切片
我在理解参考资料方面遇到了麻烦。考虑以下代码:
结果是:“bark bark rawr rawr”。
以 Java 的思维方式(这显然破坏了我对 C++ 的概念化),结果将是“bark bark bark bark”。我从之前的问题中了解到,这种差异是由于切片造成的,我现在对切片是什么有了很好的理解。
但是,假设我想要一个返回真正是 Dog 的 Animal 值的函数。
- 我是否正确理解我能得到的最接近的是参考?
- 此外,使用 rFunc 接口的人是否有责任看到返回的引用是分配一个 Animal&?(或者以其他方式故意将引用分配给通过切片丢弃多态性的 Animal。)
- 我到底应该如何返回对新生成对象的引用而不做我上面在 rFunc 中所做的愚蠢事情?(至少我听说这很愚蠢。)
更新:由于到目前为止每个人似乎都同意 rFunc 它是非法的,这带来了另一个相关的问题:
如果我传回一个指针,如果是这种情况,我如何与程序员沟通该指针不是他们要删除的?或者,我如何传达指针随时可能被删除(来自同一个线程但不同的函数),以便调用函数不应该存储它,如果是这种情况。是通过评论传达这一点的唯一方法吗?这似乎很草率。
注意:所有这些都导致了我正在研究的模板化 shared_pimpl 概念的想法。希望我能在几天内学到足够的东西来发布一些关于它的东西。
c++ - c++中的对象切片
在主要:
大家好,
我正在尝试了解对象切片并尝试使用一些示例程序。
我在某处读到了指针引用 Objcet Slicing 不会发生。
但是在下面的示例中,我注意到iDerived
无法从 访问Base pointer(varBase)
,但是virtual display method of class
即使它不在显示方法的本地范围内,我也可以访问。
现在我的问题是:
- 为什么我只能使用虚函数访问 iDerived 变量,这是否正确?
- 如何避免对象切片。
c++ - C++ 中的智能指针
假设我们有一个base
类和一个derived
. 所以:
现在说我们有这个代码使用上面的类和一个智能指针类:
我知道它会derived
通过调用 的析构函数来防止对对象进行切片derived
,但是它怎么知道这样做呢?存储在智能指针中的引用不会是 type 的引用base*
吗?它是否遍历某种层次结构树,将该指针转换为derived*
然后调用删除?或者还有什么我不知道的?
该实现被认为是线程安全的、非侵入式的和引用计数。
是的,您看到的类类似于我正在测试的类。显然有一种方法可以使用这些给定的课程来做到这一点。关于如何在我上面的问题中提到的主要思想,但我不确定这样的实现将如何工作。
c++ - 为什么虚函数需要通过指针而不是值(对象)传递?
我想我理解虚拟方法和 vtables 的概念,但我不明白为什么将对象作为指针(或引用)传递和按值传递(哪种废弃 vtable 或其他东西?)
为什么这样的事情会起作用:
而不是这个?:
c++ - 返回对切片对象的引用(超类型)
考虑以下类:
我想创建一个 NamedPoint 的成员函数——coord()——它返回对应于 NamedPoint 的 Coord 类型的引用。
例如,我想要类似的东西:
但是我收到有关临时变量的警告,我对此并不感到疯狂。
当然,以下工作:
但我宁愿返回一个参考。
有谁知道这是否可以使用继承的类?
很抱歉没有解释函数的重点。我为 Coord 和 NamedPoint 重载了 == 运算符。Coord 会简单地检查 {x,y} 而 NamedPoint 会检查 {id,x,y}。如果我忘记在此 == 测试之前将 NamedPoint 转换为 Coord,我将使用错误的版本。
所以,虽然我意识到
会给我我想要的,我宁愿使用类似的东西
我认为更清楚的是发生了什么。
c++ - 设置派生对象的基础对象?
这是一个基本的概念问题。如果我有一个继承自 Base 的 Derived 类,并且我实例化了一个新的 Derived 对象,我是否可以将它的 Base 对象设置为我选择的特定 Base 对象,以便所有调用基类方法都重定向到这个特定的基对象?
像这样的东西:
我确信我在那个简单的代码中犯了各种各样的错误,因为我的技能水平很低,但只是为了这个想法。
这在 C++ 中可能吗?我们可以将派生信息从一个对象中分割出来,那么我们可以分离和替换继承链中的组件吗?
我为什么要这样做?
考虑 mixin lilies:(再次原谅语法错误)
在这种情况下,如果我们可以将 mixin 的基础对象设置为任何所需的对象,我们就可以在 mixin 中使用带有任何参数列表的构造函数,而 mixin 不需要知道任何关于它的信息。此外,mixin 可以像装饰器一样使用,而无需装饰器之间的通用接口。
感谢您的回答。由于我们可以分割对象的派生部分,因此基础信息和派生信息似乎是分开存在的。有人可以对此发表评论吗?我们能否访问一些内部表,比如我经常听到的 vtables(我对这种类型的东西一无所知,所以这可能不适用),并完成这个?
@Benoît
您能解释一下为什么只有 1 和 4 有效,而 2 和 3 无效吗?类 Base { 受保护:std::string 名称;公共:基础(标准::字符串 n){ 名称 = n;}
这将打印:
原来的 1 x = 5 新的 1 x = 6
原始 2 x = 5 原始 2 x = 6
原始 3 x = 5 原始 3 x = 6
原来的 4 x = 5 新的 4 x = 6
为什么这仅在使用指针时才有效?
c++ - 如何克服 C++ 中的对象切片问题
我应该如何摆脱 C++ 中对象切片的问题。
在我的应用程序中,如果派生对象class
有一些动态分配的指针并且派生class
对象被分配给基class
对象,则行为是内存损坏!
c++ - 由于类切片导致的未处理异常
我在下面的注释行中收到未处理的异常读取位置 0x00000008(读取 NULL 值),包括导致错误的相关方法(以下示例继续):
活动方法:
键事件方法:
KeyDownEvent 方法:
事件处理方法:
主循环序列:
我知道这是一个切片问题,我只是不明白为什么会发生或如何解决它(实际上,现在我想起来,这可能是“无法转换为请求的类型”错误)。当我单步执行程序时,_scancode
始终是适当的值,但是第二行dynamic_cast<KeyboardKeyDownEvent*>(nxtEvent)->GetKey()
运行它就会引发错误。双重铸造dynamic_cast<KeyboardKeyDownEvent*>(dynamic_cast<KeyboardKeyEvent*>(nxtEvent))->GetKey()
失败也有同样的错误。
编辑:
经过一些调整,这个变体完美地工作: