Ich kann nicht auf Feld in der untergeordneten Klasse überschrieben von übergeordneten C++ - Konstruktor zugreifen, und ich kann keine Vorlagen verwenden, weil Upstream-Projekt sie nicht verwendet.Zugriff überschriebenes Feld im Konstruktor ohne Vorlagen
Dies funktioniert Python-Prototyp, den ich versuche, in C++ neu zu implementieren. Der Code enthält zwei Treiberklassen - ein untergeordnetes Element und ein übergeordnetes Element. Das übergeordnete Element gibt während der Initialisierung name
der Klasse aus.
class Driver(object):
name = "Unknown"
def __init__(self):
print(self.name)
class SpecificDriver(Driver):
name = "Specific"
def __init__(self):
super(SpecificDriver, self).__init__()
Driver()
SpecificDriver()
Dieser druckt zwei Saiten zu trösten
Unknown
Specific
Sieht aus wie in C++ kann nicht außer Kraft gesetzt name
zugreifen, da die name
an dieser Stelle nicht existiert - Call child method from parent constructor. Also gibt es vielleicht eine andere Möglichkeit, Treiber name
bei der Initialisierung gedruckt zu bekommen?
UPDATE (2018): Der ursprüngliche Titel für diese Frage lautete "Überschriebenes untergeordnetes Feld während der Initialisierung in C++ ohne Vorlagen überschreiben" und wurde als zu breit geschlossen.
Sie könnten statische Polymorphie aka CRTP verwenden. –
@ πάνταῥεῖ erfordert das die Verwendung von Vorlagen?In der Codebase, die ich patche, sehe ich sie nicht, und es sieht überhaupt nicht einfach aus. –
Ja, das würde "Driver" zu einer Templates-Basisklasse machen, die die Ableitungsklasse als Typparameter verwendet. Daher können Sie 'static_cast (this)' überall dort verwenden, wo Sie auf die 'SpecificDriver'-Mitglieder zugreifen möchten. Ziemlich einfach IMHO. –