Я читаю очень хорошая статья о 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;
}
Результат:
ffffffff
eeeeeeee
dddddddd
Я думаю, что это работает очень хорошо. И с использованием отладчика в VS2015, это выглядит хорошо.
Тогда почему существует ограничение на наличие нестатических элементов в унаследованных правилах стандартной компоновки?
Продолжай читать:
Стандартные классы макетов полезны для общения с кодом, написанным на других языках программирования.
Правило, которое вы цитировали, требует, чтобы только один класс в иерархии наследования объекта состоял из данных. Следовательно, такой тип «прост в использовании» для связи с кодом, написанным на других языках программирования, которые могут реализовать наследование совсем по-другому (или, например, C, не за что).
Правило не означает, что у вас не может быть более сложных типов или что вы не можете использовать эти типы различными экзотическими и интересными способами; это просто означает, что они не будут определенно называться типами «стандартной компоновки», что приводит к тому, что они не входят в эту категорию типов.
Других решений пока нет …