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

python - 为什么将 : 添加到列表切片上的任何超出范围的索引不会返回超出范围?

为什么任何大于列表长度减 1 的切片,如果后面有冒号,则不返回错误?

例子:

谢谢!

0 投票
1 回答
113 浏览

c++ - 如何在不降级为基类的情况下制作 *objects 的向量

在我的class实现中,我有这样的事情:

基类

派生类


我知道一些这样的工作选项:

使

作为类型

但我的代码将绑定到std::shared_ptr,我不能像这样简单的语法:


示例用法:

主文件

更新:

这是暂时的定义,swcApplication::Controls::add()尽管它可能仍会有所不同

0 投票
1 回答
668 浏览

c++ - 是否合法使用 initializer_list 来初始化具有派生类型的对象?

好吧,也许从标题不清楚我实际上在问什么。

我有一个带有初始化列表构造函数的类std::initializer_list<B>。是否使用类对象的初始化列表对其进行合法初始化,从D哪里D派生B

如果不合法,那是不是格式不正确?还是只是未定义的行为?

我已经在 Visual Studio 2013 Update 1 中尝试过该代码。它可以编译,但是当我运行它时,我可以看到(调试)如何:

  1. D为第一个对象D{1}(let call )创建一个类对象tempD1D构造函数被调用,然后是B构造函数。
  2. 的基础tempD1被移动到一个新B对象(tmpB1):B调用移动构造函数。
  3. 第二个对象D{2}( tmpD2, tmpB2) 也是如此。
  4. Foo初始化列表构造函数被调用。此时一切都很好。
  5. 的析构函数tmpB2被调用一次。
  6. 的析构函数tmpD2被调用两次
  7. 的析构函数tmpD1被调用一次。

我猜是编译器的一个错误(调用一个析构函数两次而错过了另一个)。但我不确定 std::initializer_list 的使用是否合法。

(修复了关于“D”或“A”名称的混淆)

0 投票
2 回答
319 浏览

c++ - C++中二维数组中的对象切片

您好,我在将派生类型对象存储在基本类型的二维数组中而不丢失存储在数组中的派生类型时遇到了一个小问题。

例如,有以下 Base 和 Derived 类:

有一点我创建了一个 Base 对象,如下所示:

然后我将上面的对象转换为 Derived 类的类型,如下所示:

此时一切正常(如果我打印出 derivedPointer 的类型,它是 Derived 类型)。

现在我有一个基类类型的二维数组,初始化如下:

现在我将 derivedPointer 值输入到数组中,如下所示:

这就是问题发生的地方,因为它存储在 referencePointer 中,但它变成了 Base 类型(对象切片),我不确定如何存储 referencePointer 值并将其类型保存在 Base 类型的数组中。

任何帮助深表感谢,

谢谢!

0 投票
2 回答
620 浏览

c++ - 具有抽象基类的工厂模式 - 按引用或按值返回?范围和切片问题

我有一个类似于下面的代码示例的类型层次结构,并且我正在尝试通过工厂模式(或者,学究起来,而不是构建器模式,因为我的工厂从 XML 文档中获取输入......但我离题)。

但是我尝试这样做,我遇到了我怀疑是由于切片(如果我按值返回)或范围界定(如果我按引用返回)的问题。

例如,下面的程序在a.doA()里面的行上有段错误C::doStuff()。如果我将调用改为value_C_factory<C>()改为ref_C_factory<C>(),我会收到一些警告,即“返回对临时的引用”,但程序b.doB()会在下一行编译、段错误(没有从a.doA()...打印任何内容)。

回溯gdb看起来像这样 - 第二行是我上面提到的代码中的那一行

是什么导致了这些段错误?正如我所怀疑的那样,它是在价值/参考案例中切片/范围吗?如果不是,那是什么?最重要的是,从输入数据构建实例的好方法是什么?

代码示例

下面的代码应该使用 GCC 4.8 编译并给出上述行为
gcc -g -Wall -std=c++11 -o test test.cpp(这就是我所做的,无论如何)。

0 投票
1 回答
50 浏览

c++ - 当类型为 shared_ptr 时,在 Locals 窗口中将本地视为派生类型

当我有shared_ptr一个派生类型,但 shared_ptr 的类型是基类型时,我在 Visual Studio 的 Locals 窗口中除了基类型的成员之外什么都看不到(就好像对象被切片一样)。

下面是一个非常小的程序,显示了我看到的问题。如果在shared_ptr构造后设置断点,并且sp在 Locals 窗口中查看变量,则看dvalue不到。

有没有办法看到这个?也许我被托管代码宠坏了......

0 投票
1 回答
104 浏览

c++ - Why does slicing occur exactly?

I understand slicing chops off the additional sub class-specific parts of an object, when we assign a super class to a sub class, like so:

and if we did:

but I don't understand why the reference works and why the object doesn't.

I have seen the reason is because without a reference the object needs to be copied- but I still don't see why this should result in the slicing?

I also don't understand why the reference works. We are pointing a Super reference to the beginning of a Sub object but the compiler knows how big a super object should be, so I wouldn't expect to associate the memory beyond the Super part (corresponding to the sub class component of the object) to the Super reference?

0 投票
1 回答
1040 浏览

c++ - 避免对象切片 C++

我有一个问题,我想复制一个对象,但又想避免对其进行切片。

有没有办法解决这个问题?我确实需要制作一个副本,因为原始对象在需要之前已经离开了范围。

0 投票
2 回答
59 浏览

c++ - 无需额外实例方法和变量的对象切片

我想知道我是否不能在类似于以下情况的情况下忽略对象切片:

根据我对对象切片的看法,即使Derived丢失了特定的复制/移动构造函数/赋值运算符,这里也没有什么可丢失的,因此它可能是一个安全的操作,假设任何Derived限制自己调用Base构造函数和设置一些数据。但这可能是我忽略的典型陷阱。

关于它的任何保证行为?

0 投票
2 回答
240 浏览

c++ - 在我错的地方用 C++ 切片?

我阅读了 C++ 中的切片问题,并尝试了一些示例(我来自 Java 背景)。不幸的是,我不理解某些行为。目前,我被困在这个例子中(来自 Efficent C++ 第三版的替代例子)。有人可以帮我理解吗?

我的简单父母类:

我的一个孩子的简单班级:

主要的:

执行后我得到:

姓名:家长

姓名:家长

Extra:子额外字符串

演员后姓名:家长

我理解前两行,因为它是“切片”的原因。但我不明白为什么我可以通过静态演员把孩子变成父母。书中写到,切片后,所有的专业信息都会被切掉。所以我想,我不能将p转换为c,因为我没有信息(在函数 printNames 的开头,创建了一个没有附加信息的新 Parent 对象)。

另外,如果演员表成功,为什么我得到“演员表后姓名:父母”而不是“演员表后姓名:孩子”?