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

c++ - 为什么这个方法不像我期望的那样调用 virtual ?

我想问一下,当我使用没有指针的虚函数时会发生什么?例如:

^^ 为什么它不起作用?我在哪里可以找到有关虚拟方法如何真正工作的信息?

0 投票
4 回答
213 浏览

c++ - 在基向量的元素上调用派生方法(给出示例)

假设我有以下类结构。我希望能够确定我的 Animal 向量中的元素是什么类类型,以便我可以对其执行特定于子类的方法。下面的示例应演示:

显然标记的代码不起作用,但是我该怎么做呢?是否有我应该遵循但不是的解决方法或设计原则?我已经研究了 dynamic_cast 但明白这很不漂亮。那么我应该如何正确地做到这一点呢?

在 Java 中,我会这样做:

0 投票
8 回答
1588 浏览

c++ - 学习 C++:返回引用并绕过切片

我在理解参考资料方面遇到了麻烦。考虑以下代码:

结果是:“bark bark rawr rawr”。

以 Java 的思维方式(这显然破坏了我对 C++ 的概念化),结果将是“bark bark bark bark”。我从之前的问题中了解到,这种差异是由于切片造成的,我现在对切片是什么有了很好的理解。

但是,假设我想要一个返回真正是 Dog 的 Animal 值的函数。

  1. 我是否正确理解我能得到的最接近的是参考
  2. 此外,使用 rFunc 接口的人是否有责任看到返回的引用是分配一个 Animal&?(或者以其他方式故意将引用分配给通过切片丢弃多态性的 Animal。)
  3. 我到底应该如何返回对新生成对象的引用而不做我上面在 rFunc 中所做的愚蠢事情?(至少我听说这很愚蠢。)

更新:由于到目前为止每个人似乎都同意 rFunc 它是非法的,这带来了另一个相关的问题:

如果我传回一个指针,如果是这种情况,我如何与程序员沟通该指针不是他们要删除的?或者,我如何传达指针随时可能被删除(来自同一个线程但不同的函数),以便调用函数不应该存储它,如果是这种情况。是通过评论传达这一点的唯一方法吗?这似乎很草率。

注意:所有这些都导致了我正在研究的模板化 shared_pimpl 概念的想法。希望我能在几天内学到足够的东西来发布一些关于它的东西。

0 投票
2 回答
1278 浏览

c++ - c++中的对象切片

在主要:

大家好,

我正在尝试了解对象切片并尝试使用一些示例程序。

我在某处读到了指针引用 Objcet Slicing 不会发生。

但是在下面的示例中,我注意到iDerived无法从 访问Base pointer(varBase),但是virtual display method of class即使它不在显示方法的本地范围内,我也可以访问。

现在我的问题是:

  1. 为什么我只能使用虚函数访问 iDerived 变量,这是否正确?
  2. 如何避免对象切片。
0 投票
5 回答
1053 浏览

c++ - C++ 中的智能指针

假设我们有一个base类和一个derived. 所以:

现在说我们有这个代码使用上面的类和一个智能指针类:

我知道它会derived通过调用 的析构函数来防止对对象进行切片derived,但是它怎么知道这样做呢?存储在智能指针中的引用不会是 type 的引用base*吗?它是否遍历某种层次结构树,将该指针转换为derived*然后调用删除?或者还有什么我不知道的?

该实现被认为是线程安全的、非侵入式的和引用计数。

的,您看到的类类似于我正在测试的类。显然有一种方法可以使用这些给定的课程来做到这一点。关于如何在我上面的问题中提到的主要思想,但我不确定这样的实现将如何工作。

0 投票
7 回答
6911 浏览

c++ - 为什么虚函数需要通过指针而不是值(对象)传递?

我想我理解虚拟方法和 vtables 的概念,但我不明白为什么将对象作为指针(或引用)传递和按值传递(哪种废弃 vtable 或其他东西?)

为什么这样的事情会起作用:

而不是这个?:

0 投票
2 回答
480 浏览

c++ - 返回对切片对象的引用(超类型)

考虑以下类:

我想创建一个 NamedPoint 的成员函数——coord()——它返回对应于 NamedPoint 的 Coord 类型的引用。

例如,我想要类似的东西:

但是我收到有关临时变量的警告,我对此并不感到疯狂。

当然,以下工作:

但我宁愿返回一个参考。

有谁知道这是否可以使用继承的类?

很抱歉没有解释函数的重点。我为 Coord 和 NamedPoint 重载了 == 运算符。Coord 会简单地检查 {x,y} 而 NamedPoint 会检查 {id,x,y}。如果我忘记在此 == 测试之前将 NamedPoint 转换为 Coord,我将使用错误的版本。

所以,虽然我意识到

会给我我想要的,我宁愿使用类似的东西

我认为更清楚的是发生了什么。

0 投票
7 回答
1537 浏览

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

为什么这仅在使用指针时才有效?

0 投票
2 回答
309 浏览

c++ - 如何克服 C++ 中的对象切片问题

我应该如何摆脱 C++ 中对象切片的问题。

在我的应用程序中,如果派生对象class有一些动态分配的指针并且派生class对象被分配给基class对象,则行为是内存损坏!

0 投票
4 回答
397 浏览

c++ - 由于类切片导致的未处理异常

我在下面的注释行中收到未处理的异常读取位置 0x00000008(读取 NULL 值),包括导致错误的相关方法(以下示例继续):

活动方法:

键事件方法:

KeyDownEvent 方法:

事件处理方法:

主循环序列:

我知道这是一个切片问题,我只是不明白为什么会发生或如何解决它(实际上,现在我想起来,这可能是“无法转换为请求的类型”错误)。当我单步执行程序时,_scancode始终是适当的值,但是第二行dynamic_cast<KeyboardKeyDownEvent*>(nxtEvent)->GetKey()运行它就会引发错误。双重铸造dynamic_cast<KeyboardKeyDownEvent*>(dynamic_cast<KeyboardKeyEvent*>(nxtEvent))->GetKey()失败也有同样的错误。

编辑:

经过一些调整,这个变体完美地工作: