Polymorphie und Funktionstabellen
Dynamische Polymorphie lässt Clientcode eine gemeinsame Operation aufrufen.
Was ist Polymorphie und Funktionstabellen?
Dynamische Polymorphie lässt Clientcode eine gemeinsame Operation aufrufen.
Wähle Verhalten über eine gemeinsame Schnittstelle.
Wichtige Punkte
- Verstehe zuerst den C-Mechanismus.
- Drücke Ownership durch RAII und Wertsemantik aus.
- Bevorzuge typsichere Abstraktionen gegenüber Makros und Casts.
Codebeispiele in C und C++
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));
}
area=16.0
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';
}
area=16
Vergleich zwischen C und C++
C baut Objektpointer und Funktionstabelle explizit; virtuelle C++-Funktionen erzeugen ähnlichen Dispatch und ein virtueller Destruktor schützt das Löschen.
C
C nutzt Namenskonventionen, Callbacks, Makros und Kontextstrukturen.
C++
Sprachfeatures liefern bereichsgebundene, typsichere Abstraktionen.
Übungsaufgaben
Führe beide Versionen aus und untersuche die unterschiedlichen Garantien.
- Implementiere zuerst den C-Mechanismus.
- Ersetze manuelles Cleanup durch RAII.
- Prüfe zusätzliche Allokationen und virtuellen Dispatch.