Я читал, что если вы объявите две структуры следующим образом:
struct Node {
int a, b, c;
};
struct DerivedNode {
struct Node base;
int d, e, f;
};
Тогда вы можете использовать указатели на них следующим образом:
struct DerivedNode myDerivedNode;
struct Node *regularNode = (struct Node *) &myDerivedNode;
regularNode->a = 3;
Другими словами, смещения адресов для a, b, c
одинаковы внутри struct Node
и struct DerivedNode
. Таким образом, вы можете получить своего рода полиморфизм, когда вы можете передать принудительно (struct Node *)
-cast DerivedNode указатель везде, где обычно берется указатель Node.
Мой вопрос в том, гарантировано ли такое поведение. Я знаю, что существуют некоторые странные проблемы с выравниванием памяти и что компилятор иногда изменяет порядок полей, чтобы добиться лучшей упаковки в памяти. Будет ли поле base
когда-либо располагаться где-либо, кроме начала struct DerivedNode
?