c++ - 派生对象数组到基础对象数组

标签 c++ arrays pointers

有多个问题与此问题非常相似,区别在于 sizeof(Base) != sizeof(Derived)。由于明显的原因,这不起作用(应用于指针的下标运算符是相对于指针大小的,而不是相对于实际的底层类型)。但是,我想知道这段代码是否正确:

struct Base
{
    int Data;
};
struct Derived : public Base
{
};
int main()
{
    static_assert(sizeof(Base) == sizeof(Derived), "Sizes are not equal");

    Derived Data[10];
    Base* Ptr = Data;
    Ptr[3].Data = 5;
}

显然,由于大小相等,Ptr[3] 将不再访问任何半撕裂的 Base 实例,但是代码仍然正确吗?

最佳答案

是的,这是正确的(在明确定义的意义上,不一定是明智的),因为这两个类是布局兼容的 - 它们是具有相同非静态数据的标准布局结构成员。

虽然它非常脆弱;对类的微小更改可能会破坏兼容性并产生未定义的行为。

关于c++ - 派生对象数组到基础对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26527937/

相关文章:

c++ - 算术运算和编译器优化

c - 在数组中输入变量时实现计数器

c++ - 寻找已排序的容器,其中指向元素的指针在添加/删除时不会改变

c++ - 如何确定 cv::Mat 是否有零值?

c++ - 使用参数从 c++ 调用 v8 javascript 函数

arrays - 使用 for 循环的数组不计算元素 Bash

java - Hibernate、Postgres 和数组类型

c++ - 动态数组。忽略大小。 C++

c - 使用指向 const 的指针

c++ - 如何在C++中输入多行?