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

c++ - 覆盖虚函数返回类型不同且不是协变的

啊,SO及时回来了。

我收到一个奇怪的错误:

这是导致问题的代码:

我查找了错误,根据我在 Microsoft 网站上找到的页面,类型可以协变的一种方式是:

B::f 的返回类型中的类与 D::f 的返回类型中的类相同,或者,是 D::f 的返回类型中的类的明确直接或间接基类,并且可在 D 中访问

Inner和不是这种情况Inner2吗?如果重要的话,我正在使用 Microsoft Visual C++ 2010。


好的,多亏了 John,我才知道只有指针和引用可以是协变的。这是为什么?Derived 可以强制转换为基类,那么为什么具有从同一事物派生的返回类型的虚拟函数不将返回类型强制转换为基类之一呢?(A*(new B))->blah()在我的示例中,返回 a似乎是有意义的Inner,它实际上是一个Inner2已经被抛出的。

0 投票
5 回答
673 浏览

c++ - C ++继承 - 子类构造函数调用?

我主要有以下内容:

我的课程是:

当我编译它时,我收到以下错误:

调用 'Sum::Sum(Identifier, Identifier)' 没有匹配的函数

候选人是: Sum::Sum(Expression&, Expression&)

Identifier 类继承自 Expression,那么为什么会出现此错误?

0 投票
4 回答
1144 浏览

c++ - 什么是隐藏切片复制构造函数?

这个问题是因为这个问题和评论

这个例子:

当使用 g++ 4.6.1 像这样编译时:

产生下一个输出:

输出是A catch

我了解由于切片问题而触发了第一个 catch 块。

  1. 它在哪里说基类中的隐藏复制构造函数?
  2. 它在哪里说明了这种行为?

PS1 请提供标准引用的答案。
PS2 而且我知道异常应该由 const 引用处理。

0 投票
1 回答
3507 浏览

c++ - `e.what()` 怎么会打印“错误分配”?

块中的new表达式try抛出一个bad_alloc我的计算机中

请注意,catch 子句通过值而不是引用接收异常对象。怎么会有e.what()印记"bad allocation"?我以为它会被切片。

0 投票
5 回答
52858 浏览

c++ - 将派生类对象存储在基类变量中

我想将几个类的实例存储在一个向量中。由于所有类都继承自同一个基类,这应该是可能的。

想象一下这个程序:

我希望它打印“派生”,因为“识别”方法是虚拟的。相反,“vect [0]”似乎是一个“基础”实例,它会打印

根据

我想我可以以某种方式编写自己的容器(可能从向量派生)能够做到这一点(也许只保存指针......)。我只是想问一下是否有更多的 C++ish 方法可以做到这一点。而且我想完全兼容矢量(如果其他用户应该使用我的代码,只是为了方便)。

0 投票
2 回答
118 浏览

c++ - 作者所说的不良结果是什么?

这个例子取自 Bruce Eckel 的“Thinking in C++”第 14 章“Upcasting and the Copy Constructor”一节。

作者对此代码发表以下评论:

“ Child 的 operator<< 很有趣,因为它为其中的 Parent 部分调用 operator<< 的方式:通过将 Child 对象转换为 Parent& (如果您转换为基类对象而不是引用,则通常会得到不良结果):

我还运行程序,将上述指令替换为:

并且程序运行没有问题,只有一个预期的差异。现在Parent再次调用复制构造函数将参数复制cParent::operator<<().

那么,作者所说的不良结果是什么?

0 投票
2 回答
8240 浏览

c++ - 将对象(不是指针)向下转换为已知的派生类型是否安全?

会不会有切片的危险

在哪里

并且obj1确定obj2Block对象?

我很想使用:

但是在阅读 SO 对对象切片标签的简要描述时,我很想使用前者。但我真的不想要任何讨厌的无声切片。

0 投票
1 回答
932 浏览

c++ - 如何将子类分配给函数中的抽象类指针?

在调用函数后,我试图使实际的板参考等于新板。Board 是一个抽象类, get_board() 返回一个指向 Board 的指针,但它实际上是 board 的一个子类,它有一个额外的属性。但是,调用 move 函数后,棋盘与调用 move 之前的棋盘相同。是否可以在修改实际值的同时将子类分配给指向抽象超类的指针?切片问题似乎正在发生。

0 投票
3 回答
359 浏览

c++ - Will this result in object slicing?

Say I have an array of pointers to an abstract class:

And I have two classes that extend Piece called King and Queen. I assign a King to a spot in pieces and Queen to another spot:

If I haven't overloaded the assignment operator, does slicing occur? Or does pieces[0] is an instance of King and pieces[1] is an instance of Queen? What is going on in that array (if this was C++)?

EDIT: See a full example of the code in question here.

0 投票
3 回答
1470 浏览

c# - C# vs C++ - 类型、继承和 vtable

我无法理解导致 C++ 和 C# 之间这种差异的原因。

首先,我们有一个基类包含虚函数的示例。

正如预期的那样,它的输出是“Derived”。

如果我们删除 f(),这将不再有效。输出是“基础”。例子:

我对此的理解是,拥有一个虚函数会导致编译器向对象添加一个 vptr,该对象指向 vtable。vtable 包含要调用的正确函数的地址 (Derived::f()) - (以及对象的类型信息?)

现在是有趣的部分 - 与 C# 的比较。在这里,“Base”和“Derived”基本上是类似于第二个 C++ 示例的空类:

因此,我的问题是:我对 C++ 部分的理解是否正确,当 C++ 不正确时,C# 如何正确识别对象的类型?