c / expert
Snippet
Struct-Komposition und Zeiger-Typkonvertierung für polymorphe Objekt-Untertypisierung
Der C-Standard garantiert, dass ein Zeiger auf eine Struktur sicher in einen Zeiger auf deren erstes Element konvertiert werden kann. Durch Einbetten eines Basis-Struct-Headers als allererstes Element emulieren C-Programme Untertypisierung und Vererbung. Funktionen, die Basis-Zeiger erwarten, können abgeleitete Instanzen sicher verarbeiten.
snippet.c
c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>typedef struct BaseObject {int id;const char *type_name;} BaseObject;typedef struct Widget {BaseObject base; /* Base struct placed as the first member */int width;int height;} Widget;void render_object(const BaseObject *obj) {printf("Rendering [%s] ID: %d\n", obj->type_name, obj->id);}int main(void) {Widget w = {.base = { .id = 101, .type_name = "UI_Widget" },.width = 1920,.height = 1080};/* Standard C guarantees offsetof(Widget, base) == 0, enabling safe base pointer casts */render_object((const BaseObject *)&w);return 0;}
Erklärung
1
BaseObject base; /* Base struct placed as the first member */
Stellt sicher, dass die Speicheradresse des abgeleiteten Widgets exakt mit der Adresse des Basis-Struct-Headers übereinstimmt.
2
render_object((const BaseObject *)&w);
Konvertiert den abgeleiteten Struct-Zeiger sicher in einen Basis-Zeiger für polymorphe Wiederverwendung.