Ich habe eine Basisklasse mit einem Zeiger, der speziell im Konstruktor aller Unterklassen initialisiert werden muss. Wie kann ich sicherstellen, dass diese Variable in den Konstruktoren der Unterklassen initialisiert wird? Ich möchte im Wesentlichen die gleiche Funktionalität wie eine rein virtuelle Funktion, außer mit einem Zeiger auf ein Objekt. Gibt es eine Möglichkeit, das zu tun?
Mein Code sieht ungefähr so aus:
A.hpp:
%Vor%B.hpp:
%Vor%B.cpp:
%Vor%Gibt es einen Weg, dies zu erreichen?
Ich würde alle Datenelemente private
als protected
machen, bedeutet aber immer noch, dass Sie die Schnittstelle nie ändern können. Die Angabe des Datenmembers private
weist auch darauf hin, wie sichergestellt wird, dass es von der abgeleiteten Klasse bereitgestellt wird: Geben Sie der Basisklasse einen Konstruktor, der einen geeigneten Zeiger benötigt, um übergeben zu werden. Wenn Sie sicherstellen möchten, dass die abgeleitete Klasse am besten übergeben wird Setzen Sie in einem Zeiger die Basisklasse auf virtual
base:
Leider können aktuelle virtuelle Tabellen nicht (portabel) direkt "virtuelle Daten" enthalten, dh Metadaten, die auf Klassenebene vorkommen.
Sie könnten eine virtuelle Methode veranlassen, einen Zeiger auf ein paar X
...
Sie könnten auch typeinfo verwenden, also typeid
(in C ++ 11). Zum Beispiel könnten Sie eine statische Hash-Tabelle definieren
Es liegt dann an Ihnen, die map
entsprechend zu füllen.
Es wäre ausreichend, wenn die Basisklasse diese Variable selbst initialisiert, indem sie einen Konstruktor mit einem Parameter hat, der den Initialisierungswert enthält.
%Vor%In diesem Fall muss jede abgeleitete Klasse den Basisklassenkonstruktor explizit aufrufen und einen erforderlichen Wert angeben.
%Vor%