首页 文章

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

提问于
浏览
1

我读了很多关于POD,Trivial,标准布局类的nice article . 但我对标准布局类的规则有疑问:

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

我写了一个源代码:

#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;
}

结果是:

ffffffff
eeeeeeee
dddddddd

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

enter image description here

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

1 回答

  • 8

    继续阅读:

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

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

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

相关问题