警告:在非标准布局类型'DerivedClass'上偏移

warning: offset of on non-standard-layout type 'DerivedClass'

本文关键字:DerivedClass 布局 类型 警告 非标准      更新时间:2023-10-16

我需要摆脱此警告。据我所知,这是因为派生频道不被视为普通旧数据。我阅读有关POD和标准布局类型的cppReference,但我仍然不明白为什么衍生流不是POD。如果我将Baseclass的成员放入派生阶级,并且不使用继承 - 那么一切都可以。我使用C 11

这是一个示例:

#include <iostream>
using namespace std;
class BaseClass
{
public:
    int a;
};
class DerivedClass : public BaseClass
{
public:
    int b;
};
int main(int argc, char *argv[])
{
    // warning: offset of on non-standard-layout type 'DerivedClass'
    int offset = offsetof(DerivedClass, b);
    cout << offset;
}

我感谢任何帮助。

这些是标准布局类型的要求:

所有非静态数据成员都有相同的访问控制

没有虚拟函数或虚拟基类

没有参考类型的非静态数据成员

所有非静态数据成员和基类都是标准布局类型

直到C 14:

没有与非静态数据成员的基础类,或者

在最派生的类中没有非静态数据成员,最多有一个非静态数据成员的基类

没有与第一个非静态数据成员相同类型的基本类别(请参阅空基础优化)

此部分适用于此示例:

has no base classes with non-static data members,

在您的情况下,您有一个具有非静态数据成员的基类。删除a删除警告。

C 14之后,有类似的限制,您不能在两个类中有成员,只有一个:

在同一类中声明了所有非静态数据成员和位字场(无论是在派生还是全部在某些基础中)