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

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/

10-11 00:51
查看更多