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)
我很感激任何帮助。
这些是标准布局类型的要求:
所有非静态数据成员具有相同的访问控制
没有虚函数或虚基类
没有引用类型的非静态数据成员
所有非静态数据成员和基类本身都是标准布局类型
直到 C++14:
任何一个
没有带有非静态数据成员的基类,或者
在最派生的类中没有非静态数据成员,并且最多有一个具有非静态数据成员的基类
没有与第一个非静态数据成员相同类型的基类(参见空基优化)
本部分适用于本例:
has no base classes with non-static data members,
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您有一个带有非静态数据成员的基类。删除a 会删除警告。
C++14以后,也有类似的约束,不能有两个类的成员,只有一个:
在同一个类中声明了所有非静态数据成员和位域(要么全部在派生类中,要么全部在某个基类中)
| 归档时间: |
|
| 查看次数: |
2301 次 |
| 最近记录: |