Modernes C++ und C-Alternativen

Polymorphie in C++ und Funktionszeigertabellen in C

In dieser Lektion rufst du dieselbe Operation für verschiedene Objektarten auf, mit virtuellen Funktionen in C++ und Funktionszeigern in C.

Einführung

Dynamische Polymorphie (dynamic polymorphism) erlaubt dem Code, eine gemeinsame Operation wie die Flächenberechnung aufzurufen, während jede konkrete Objektart selbst entscheidet, wie sie ausgeführt wird. C++ unterstützt das direkt mit virtuellen Funktionen (virtual functions), in C lässt es sich mit Funktionszeigern nachbilden.

Wichtige Punkte

  • Verstehe zuerst, wie es in C funktioniert, bevor du die Abstraktionen von C++ lernst.
  • Drücke den Besitz von Ressourcen mit RAII und Wertsemantik (value semantics) aus.
  • Bevorzuge die typsicheren Werkzeuge von C++ gegenüber Makros und Typumwandlungen.

Codebeispiele in C und C++

C
Code ausführen →
main.c
#include <stdio.h>

typedef struct Shape Shape;
struct Shape {
    double value;
    double (*area)(const Shape *shape);
};

double square_area(const Shape *shape) {
    return shape->value * shape->value;
}

int main(void) {
    Shape square = {4.0, square_area};
    printf("area=%.1f\n", square.area(&square));
}
Ergebnis der Ausführung
area=16.0
C++
Code ausführen →
main.cpp
#include <iostream>

struct Shape {
    virtual double area() const = 0;
    virtual ~Shape() = default;
};

struct Square : Shape {
    double side;

    explicit Square(double value) : side(value) {}
    double area() const override { return side * side; }
};

int main() {
    Square square(4);
    const Shape& shape = square;
    std::cout << "area=" << shape.area() << '\n';
}
Ergebnis der Ausführung
area=16

C und C++ im Vergleich

In C speichert struct Shape einen Funktionszeiger area, und jede Form hängt ihre eigene Flächenfunktion an, etwa square_area. In C++ erzeugen virtuelle Funktionen denselben Auswahlmechanismus automatisch. Die Basisklasse sollte außerdem einen virtuellen Destruktor (virtual destructor) haben, damit das Löschen eines Objekts über einen Basisklassenzeiger sicher ist.

C

C verwendet Namenskonventionen, Callbacks, Makros und structs mit Kontext.

C++

C++ bietet Abstraktionen mit klarem Gültigkeitsbereich, die typsicher sind und zur Laufzeit meist nichts zusätzlich kosten.

Übungen zur Vertiefung

Führe beide Versionen aus und ändere dann den Code, um zu beobachten, welche Sicherheit jede Sprache bietet.

  • Schreibe den Mechanismus zuerst in C und verwende erst dann die entsprechende C++-Funktion.
  • Ersetze das manuelle Freigeben von Ressourcen durch RAII.
  • Prüfe, ob die Funktion Speicherreservierungen oder Aufrufe virtueller Funktionen verursacht.

Mit einer Challenge üben

Nutze den Inhalt dieser Lektion, um ein echtes Problem zu lösen. Jede Challenge läuft im Browser, mit sofortigen Tests und einem KI-Review.

Alle Challenges