Rainer Grimm hat am 5. Oktober 2017 die Regeln der C++ Core Guidelines für Klassenhierarchien erläutert. Die historische Originalfassung empfiehlt in C.120 Vererbung nur für tatsächlich hierarchische Konzepte. Eine gemeinsame Basisklasse ist deshalb kein Selbstzweck, um unterschiedliche Systeme in einem Engine-Projekt zusammenzufassen.
Schnittstelle und Implementierung erfüllen verschiedene Aufgaben
C.121 empfiehlt reine abstrakte Klassen als Schnittstellen. C.129 unterscheidet diese Trennung von der Wiederverwendung einer Implementierung. Für Editorwerkzeuge kann beispielsweise eine gemeinsame Zeichenschnittstelle sinnvoll sein. Daraus folgt aber nicht, dass jedes Werkzeug auch denselben Datenbestand oder dieselbe Ressourcenverwaltung erben sollte.
Die Designprüfung muss beim Vertrag beginnen: Welche Operationen kann jede abgeleitete Klasse sinnvoll erfüllen? Wenn eine Basisklasse Funktionen verlangt, die mehrere Unterklassen nur mit einer Fehlermeldung beantworten können, ist die Abstraktion zu breit. Ein Datenmember statt Vererbung kann die Beziehung klarer ausdrücken.
Öffentlich virtuell oder geschützt nichtvirtuell
C.127 verlangt für die Freigabeentscheidung einen öffentlichen virtuellen oder geschützten nichtvirtuellen Destruktor. Die geschützte Variante verhindert das Löschen durch externen Code über einen Basisklassenzeiger. Sie bewirkt nicht, dass ein abgeleiteter Destruktor bei einer beliebigen nichtvirtuellen Freigabe automatisch aufgerufen wird. Die Destruktor-Regeln beschreiben bereits das undefinierte Verhalten bei ungeeigneter Freigabe über die Basisklasse.
C.128 empfiehlt eine eindeutige Kennzeichnung: virtual für eine neue virtuelle Funktion, override für eine Überschreibung und final für deren Abschluss. Das macht die Absicht prüfbar. Eine falsche Signatur mit override wird vom Compiler zurückgewiesen, statt unbeabsichtigt eine andere Funktion zu deklarieren.
Archivhinweis: Grundlage ist der offizielle Repository-Stand vom 7. Oktober 2017. Der Beitrag beschreibt Empfehlungen für C++-Code, keine neue Sprachversion oder gemessene Beschleunigung einer Engine. Das Standard-C++-Logo ist ein Symbolbild.

