问题标签 [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++ - 覆盖虚函数返回类型不同且不是协变的
啊,SO及时回来了。
我收到一个奇怪的错误:
这是导致问题的代码:
我查找了错误,根据我在 Microsoft 网站上找到的页面,类型可以协变的一种方式是:
B::f 的返回类型中的类与 D::f 的返回类型中的类相同,或者,是 D::f 的返回类型中的类的明确直接或间接基类,并且可在 D 中访问
Inner
和不是这种情况Inner2
吗?如果重要的话,我正在使用 Microsoft Visual C++ 2010。
好的,多亏了 John,我才知道只有指针和引用可以是协变的。这是为什么?Derived 可以强制转换为基类,那么为什么具有从同一事物派生的返回类型的虚拟函数不将返回类型强制转换为基类之一呢?(A*(new B))->blah()
在我的示例中,返回 a似乎是有意义的Inner
,它实际上是一个Inner2
已经被抛出的。
c++ - C ++继承 - 子类构造函数调用?
我主要有以下内容:
我的课程是:
当我编译它时,我收到以下错误:
调用 'Sum::Sum(Identifier, Identifier)' 没有匹配的函数
候选人是: Sum::Sum(Expression&, Expression&)
Identifier 类继承自 Expression,那么为什么会出现此错误?
c++ - `e.what()` 怎么会打印“错误分配”?
块中的new
表达式try
抛出一个bad_alloc
我的计算机中
请注意,catch 子句通过值而不是引用接收异常对象。怎么会有e.what()
印记"bad allocation"
?我以为它会被切片。
c++ - 将派生类对象存储在基类变量中
我想将几个类的实例存储在一个向量中。由于所有类都继承自同一个基类,这应该是可能的。
想象一下这个程序:
我希望它打印“派生”,因为“识别”方法是虚拟的。相反,“vect [0]”似乎是一个“基础”实例,它会打印
根据
我想我可以以某种方式编写自己的容器(可能从向量派生)能够做到这一点(也许只保存指针......)。我只是想问一下是否有更多的 C++ish 方法可以做到这一点。而且我想完全兼容矢量(如果其他用户应该使用我的代码,只是为了方便)。
c++ - 作者所说的不良结果是什么?
这个例子取自 Bruce Eckel 的“Thinking in C++”第 14 章“Upcasting and the Copy Constructor”一节。
作者对此代码发表以下评论:
“ Child 的 operator<< 很有趣,因为它为其中的 Parent 部分调用 operator<< 的方式:通过将 Child 对象转换为 Parent& (如果您转换为基类对象而不是引用,则通常会得到不良结果):
我还运行程序,将上述指令替换为:
并且程序运行没有问题,只有一个预期的差异。现在Parent
再次调用复制构造函数将参数复制c
到Parent::operator<<()
.
那么,作者所说的不良结果是什么?
c++ - 将对象(不是指针)向下转换为已知的派生类型是否安全?
会不会有切片的危险
在哪里
并且obj1
确定obj2
是Block
对象?
我很想使用:
但是在阅读 SO 对对象切片标签的简要描述时,我很想使用前者。但我真的不想要任何讨厌的无声切片。
c++ - 如何将子类分配给函数中的抽象类指针?
在调用函数后,我试图使实际的板参考等于新板。Board 是一个抽象类, get_board() 返回一个指向 Board 的指针,但它实际上是 board 的一个子类,它有一个额外的属性。但是,调用 move 函数后,棋盘与调用 move 之前的棋盘相同。是否可以在修改实际值的同时将子类分配给指向抽象超类的指针?切片问题似乎正在发生。
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.
c# - C# vs C++ - 类型、继承和 vtable
我无法理解导致 C++ 和 C# 之间这种差异的原因。
首先,我们有一个基类包含虚函数的示例。
正如预期的那样,它的输出是“Derived”。
如果我们删除 f(),这将不再有效。输出是“基础”。例子:
我对此的理解是,拥有一个虚函数会导致编译器向对象添加一个 vptr,该对象指向 vtable。vtable 包含要调用的正确函数的地址 (Derived::f()) - (以及对象的类型信息?)
现在是有趣的部分 - 与 C# 的比较。在这里,“Base”和“Derived”基本上是类似于第二个 C++ 示例的空类:
因此,我的问题是:我对 C++ 部分的理解是否正确,当 C++ 不正确时,C# 如何正确识别对象的类型?