我读了很多关于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中使用调试器,它看起来很好 .
那么,为什么在继承的标准布局规则中有非静态成员的限制呢?
1 回答
继续阅读:
您引用的规则要求对象的继承层次结构中只有一个类由数据组成 . 因此,这种类型用于与用其他编程语言编写的代码进行通信,这些代码可能以非常不同的方式实现继承(或者像C一样,根本不实现) .
规则并不意味着您不能拥有更复杂的类型,或者您不能以各种异国情调和有趣的方式使用这些类型;它只是意味着它们不会被特别称为“标准布局”类型,其后果与不属于该类别类型一致 .