Gibt es eine Möglichkeit, eine "virtuelle" Variable in einer C ++ - Basisklasse zu erstellen?

8

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?

    
jackcogdill 01.01.2014, 19:59
quelle

5 Antworten

11

Konstruktor der Basisklasse ändern:

%Vor%

Und so muss ein Kind Wert geben, wie:

%Vor%     
Jarod42 01.01.2014, 20:13
quelle
5

Definieren Sie einfach Argumente für den Basisklassenkonstruktor:

%Vor%

Dann muss die abgeleitete Klasse diese in ihrer ctor-initializer -Liste übergeben:

%Vor%     
Ben Voigt 01.01.2014 20:14
quelle
3

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:

%Vor%     
Dietmar Kühl 01.01.2014 20:13
quelle
1

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 ...

zurückzugeben

Sie könnten auch typeinfo verwenden, also typeid (in C ++ 11). Zum Beispiel könnten Sie eine statische Hash-Tabelle definieren

%Vor%

Es liegt dann an Ihnen, die map entsprechend zu füllen.

    
Basile Starynkevitch 01.01.2014 20:03
quelle
1

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%     
Vlad from Moscow 01.01.2014 20:15
quelle

Tags und Links