警告:非标准布局类型“DerivedClass”的偏移

chm*_*chm 3 c++ memory-layout c++11

我需要摆脱这个警告。据我了解,这似乎是因为 DerivedClass 不被视为普通旧数据。我阅读了关于POD标准布局类型的cppreference,但我仍然不明白为什么 DerivedClass 不是 POD。如果我将 BaseClass 的成员放入 DerivedClass 并且不使用继承 - 则一切正常。我使用 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;
}
Run Code Online (Sandbox Code Playgroud)

我很感激任何帮助。

Mat*_*her 5

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

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

没有虚函数或虚基类

没有引用类型的非静态数据成员

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

直到 C++14:

任何一个

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

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

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

本部分适用于本例:

has no base classes with non-static data members,
Run Code Online (Sandbox Code Playgroud)

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

C++14以后,也有类似的约束,不能有两个类的成员,只有一个:

在同一个类中声明了所有非静态数据成员和位域(要么全部在派生类中,要么全部在某个基类中)