1. Einführung
Die Programmiersprache C ist bei vielen Programmierern wegen ihres historischen Hintergrunds und der Low‑Level‑Kontrolle beliebt. Allerdings ist C keine objektorientierte Sprache. Mit anderen Worten, im Gegensatz zu Java oder C++ unterstützt C von Haus aus keine objektorientierten Features wie Klassen, Vererbung oder Kapselung. Dennoch ist es möglich, objektorientierte Programmierkonzepte (OOP) in C zu imitieren und ein gewisses Maß an OOP‑Funktionalität zu erreichen. In diesem Artikel erklären wir, wie Sie objektorientierte Programmierung in C implementieren können, wobei wir uns auf die Schlüsselkonzepte Kapselung, Vererbung und Polymorphie konzentrieren.
2. Grundkonzepte der objektorientierten Programmierung
Objektorientierte Programmierung (OOP) zielt darauf ab, Daten und die Methoden, die auf diesen Daten operieren, als eine Einheit zu verwalten. Dieser Ansatz hilft, die Programmstruktur zu verdeutlichen und verbessert Wiederverwendbarkeit und Wartbarkeit. Die Hauptkonzepte in OOP sind Kapselung, Vererbung und Polymorphie. Obwohl C diese Features nicht direkt unterstützt, kann man sie mit etwas Einfallsreichtum in ähnlicher Weise implementieren.
2.1 Kapselung
Kapselung bedeutet, Daten und ihre Operationen (Methoden) zu einer einzigen Einheit zu bündeln und den Zugriff von außen zu kontrollieren. In C können Sie Daten mit structs gruppieren. Structs übernehmen eine ähnliche Rolle wie Klassen, indem sie mehrere Datenstücke zu einer Struktur zusammenfassen.
typedef struct {
int age;
char name[50];
} Person;
In diesem struct kapselt der Datentyp Person sowohl Alters‑ als auch Namensinformationen. Dadurch können Sie Instanzen von Person erstellen und mit ihnen arbeiten.
2.2 Vererbung
C verfügt nicht über ein natives Vererbungsfeature, sodass Sie keine Eltern‑Kind‑Beziehungen wie bei Klassen erzeugen können. Durch das Einbinden eines structs als Mitglied eines anderen können Sie jedoch einen Mechanismus erreichen, der der Vererbung ähnelt.
typedef struct {
int age;
} Parent;
typedef struct {
Parent parent;
int studentID;
} Child;
In diesem Code enthält das Child‑struct ein Parent‑struct und stellt damit eine Form von Pseudo‑Vererbung dar.
2.3 Polymorphie
Polymorphie bedeutet die Fähigkeit, dass dieselbe Operation je nach Objekttyp unterschiedlich reagiert. In C können Sie dies mit Funktionszeigern erreichen. Ein Funktionszeiger ist eine Variable, die die Adresse einer Funktion speichert und es Ihnen ermöglicht, dynamisch verschiedene Funktionen aufzurufen.
typedef int (*OperationFunc)(int, int);
int add(int a, int b) {
return a + b;
}
int multiply(int a, int b) {
return a * b;
}
OperationFunc op = add; // Set to add function
printf("%d", op(3, 4)); // Output: 7
op = multiply; // Switch to multiply function
printf("%d", op(3, 4)); // Output: 12
Wie gezeigt, können Sie mit demselben Funktionszeiger unterschiedliche Operationen ausführen.

3. Wie man Klassen in C implementiert
Um objektorientierte Programmierung nach C zu bringen, müssen Sie das Konzept von Klassen simulieren. Dies geschieht durch die Kombination von structs und Funktionszeigern, um klassenähnliche Strukturen zu erzeugen.
3.1 Structs als Klassen verwenden
Um Klassen in C zu implementieren, verwenden Sie structs, um Daten und Methoden zusammenzufassen. Methoden werden als Funktionen definiert und innerhalb des structs über Funktionszeiger verwaltet.
typedef struct {
int age;
void (*setAge)(struct Person*, int);
int (*getAge)(struct Person*);
} Person;
void setAge(struct Person* p, int age) {
p->age = age;
}
int getAge(struct Person* p) {
return p->age;
}
Person person = {0, setAge, getAge};
person.setAge(&person, 25);
printf("Age: %d", person.getAge(&person)); // Output: 25
In diesem Beispiel besitzt das Person‑struct die Methoden setAge und getAge, wodurch ein klassenähnliches Verhalten ermöglicht wird.
4. Implementierung von Methoden
Um „Methoden“, ein zentrales Merkmal von OOP, in C nachzubilden, verwenden Sie Funktionszeiger. Damit können Sie Methoden als Mitglieder des structs definieren.
typedef struct {
int age;
void (*setAge)(struct Person*, int);
} Person;
void setAge(struct Person* p, int age) {
p->age = age;
}
5. Zusammenfassung und Anwendungen
Obwohl Sie objektorientierte Features in C implementieren können, sollten Sie bedenken, dass die Sprache selbst OOP nicht nativ unterstützt. Sie benötigen etwas Kreativität und müssen Strukturen, Funktionszeiger und Speicherverwaltung voll ausnutzen, um klassen- und vererbungsähnliche Konzepte zu integrieren.



