Zitat:
Ich denke nicht, dass man es unbedingt braucht, aber wie gesagt, es macht vieles einfacher. Zum Beispiel, wenn ich an eine doppelt-verkettete, lineare Liste denke, mit solchen Knoten:
Code:
ListenKnoten* next;
ListenKnoten* prev;
Object* value;
Mit einem allumfassenden Basis-Objekt kann man den selben Knoten für alle Arten von Klassen verwenden, weil ich ja die Objekte immer casten kann.
Wenn ich das nicht kann, müsste man zB ja für jede Art Value eine Subklasse der Basisklasse ListenKnoten machen, die dann fähig ist, die entsprechenden Objekte aufzunehmen. Oder irre ich da?
Die Knoten kannst du mit Zeigern auf void untereinander verknüpfen. Ein void* kann nämlich auf jedes Objekt zeigen. Allerdings braucht man immer noch die Typinformation in irgendeiner Form, wenn Objekte mit einem nicht-trivialen Destruktor gespeichert werden sollen. Denn mithilfe eines void* alleine kommt man nicht an den Destruktor heran. In deinem Beispiel würde eine gemeinsame Basisklasse also tatsächlich helfen. Nur muss man im Gegenzug auch beachten, dass eine gemeinsame polymorphe Basisklasse gleich alle Objekte deren Typ eine Klasse ist aufblähen würde. Allerdings glaube ich mittlerweile das eine gemeinsame Basisklasse für alle Klassen, die sowieso schon polymorph sind ein guter Kompromiss wäre. Das würde sich mit verbreiteten C++-Implementierungen mit "fast" Null-Overhead bewerkstelligen lassen. Man könnte dann ja auch immer noch einen Mechanismus haben, um diese Basisklasse zu verhindern, wenn das wirklich gewünscht wird.