Почему существует правило наличия нестатических элементов в унаследованных правилах стандартной компоновки?

Я читаю очень хорошая статья о 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, это выглядит хорошо.

введите описание изображения здесь

Тогда почему существует ограничение на наличие нестатических элементов в унаследованных правилах стандартной компоновки?

1

Решение

Продолжай читать:

Стандартные классы макетов полезны для общения с кодом, написанным на других языках программирования.

Правило, которое вы цитировали, требует, чтобы только один класс в иерархии наследования объекта состоял из данных. Следовательно, такой тип «прост в использовании» для связи с кодом, написанным на других языках программирования, которые могут реализовать наследование совсем по-другому (или, например, C, не за что).

Правило не означает, что у вас не может быть более сложных типов или что вы не можете использовать эти типы различными экзотическими и интересными способами; это просто означает, что они не будут определенно называться типами «стандартной компоновки», что приводит к тому, что они не входят в эту категорию типов.

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]