c++ - 这应该被称为对象切片的一些特殊情况吗?

标签 c++ arrays inheritance terminology pointer-arithmetic

假设我有一个类 Derived,它派生自类 Basesizeof(Derived) > sizeof(Base)。现在,如果像这样分配一个 Derived 数组:

Base * myArray = new Derived[42];

然后尝试使用

访问第n对象
doSomethingWithBase(myArray[n]);

那么这可能(但并非总是)由于从无效位置访问 Base 导致未定义的行为。

这种编程错误的正确说法是什么? 是否应该将其视为 object slicing 的情况? ?

最佳答案

它根本不是切片,而是未定义的行为,因为您正在访问一个不存在的 Derived 对象(除非您很幸运并且尺寸对齐,在这种情况下它仍然是 UB但无论如何可能会做一些有用的事情)。

这是一个简单的指针运算失败的例子。

关于c++ - 这应该被称为对象切片的一些特殊情况吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37051199/

相关文章:

c++ - 继承类在这种情况下如何工作???

php - PHP 7 的 self 在什么情况下引用基类?

c++ - 在 C++ 中使用 libcurl 设置 --data-binary

c++ - 应用程序和 exe 之间的类大小更改

c++ - 使用 cppyy 连接 C++ 和 pypy 时遇到错误

C++ - 使用临时变量索引数组

c++ - 为什么我可以使用错误的参数成功地 std::bind?

javascript - 测试数组是否包含八个 3 键值中的任何一个 - Tic Tac Toe 游戏

c++ - 来自数组指针的正确语法访问值?

java - Hibernate 从同一个请求返回同一个实体,但在一种情况下它被代理,而在第二种情况下它不是。为什么?