为什么在继承的标准布局规则中有非静态成员的规则?

Seo*_*ong 1 c++ pod standard-layout c++11

我读了一篇关于POD,Trivial,Standard-layout类的非常好的文章.但我对标准布局类的规则有疑问:

要么在大多数派生类中没有非静态数据成员,要么最多只有一个具有非静态数据成员的基类,或者没有带有非静态数据成员的基类

我写了一个源代码:

#include <iostream>

struct A {
    int a;
};

struct B {
    int b;
};

struct C : A, B {
    int c;
};

int main() {
    C c = {}; // initialize C
    c.a = 0xffffffff;
    c.b = 0xeeeeeeee;
    c.c = 0xdddddddd;
    std::cout << std::hex << *(reinterpret_cast<int*>(&c)  ) << std::endl;
    std::cout << std::hex << *(reinterpret_cast<int*>(&c)+1) << std::endl;
    std::cout << std::hex << *(reinterpret_cast<int*>(&c)+2) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

结果是:

ffffffff
eeeeeeee
dddddddd
Run Code Online (Sandbox Code Playgroud)

我觉得它运作得很好.在VS2015中使用调试器,它看起来很好.

在此输入图像描述

那么,为什么在继承的标准布局规则中有非静态成员的限制?

Lig*_*ica 8

继续阅读:

标准布局类对于与使用其他编程语言编写的代码进行通信非常有用.

您引用的规则要求对象的继承层次结构中只有一个类由数据组成.因此,这种类型"易于"用于与用其他编程语言编写的代码进行通信,这些代码可以非常不同地实现继承(或者像C一样,根本不实现).

规则并不意味着您不能拥有更复杂的类型,或者您不能以各种异国情调和有趣的方式使用这些类型; 它只是意味着它们不会被特别称为"标准布局"类型,其后果与不属于该类别的类型一致.