[Vererbung]: heute: Konstruktoren "ausschalten"
-
Ich habe eine Klasse, die von einer anderen Klasse abgeleitet ist, die Startklasse hat div. Membervariablen im Sichtbarkeitsbereich protected.
Weil die Startklasse nen virtuellen Destruktor hat, habe ich den Konstruktor in pivate geschrieben. Jetzt meckert der Compiler, dass kein geeigneter Standardkonstruktor zur verfügung steht. Wie schaff ich es den Konstruktor der Startklasse zu umgehen?thx
Glamdring
-
Glamdrink schrieb:
Weil die Startklasse nen virtuellen Destruktor hat, habe ich den Konstruktor in pivate geschrieben.
Wo ist da die Logik?
Jetzt meckert der Compiler, dass kein geeigneter Standardkonstruktor zur verfügung steht. Wie schaff ich es den Konstruktor der Startklasse zu umgehen?
???
Wenn kein Standardkonstruktor da ist, musst du entweder einen schreiben, oder einen vom Compiler generieren lassen (indem du alle anderen Konstruktoren entfernst), oder die Klasse nie ohne Argumente instanziieren.
-
Gar nicht. Die Unterklasse muß einen Konstruktor aufrufen. Im Zweifelsfall auch einen compilergenerierten. Warum solltest du auch den Konstruktoraufruf der Oberklasse umgehen wollen?!
Weil die Startklasse nen virtuellen Destruktor hat, habe ich den Konstruktor in pivate geschrieben.
Diesen Zusammenhang verstehe ich nicht. Was hat das eine mit dem anderen zu tun?
Stefan.
-
Wenn eine Klasse, durch irgendeine virtuelle Funktion, abstrakt ist kann sie nicht instnziiert werden, also brauc sie auch keinen Konstruktor, ds Problewm ist bloß, dass ich nihct auf die protected Elemente zugreifen kann, weil der Oberklassenkonstruktor das machen müsste, es aber nicht kann, weil für jede der abgeleiteten Klasse die Werte unterschiedlich sind.
thx
Glamdring
-
Glamdrink schrieb:
Wenn eine Klasse, durch irgendeine virtuelle Funktion abstrakt ist kann sie nicht instanziiert werden,
Falsch. Sie kann nicht instanziiert werden, falls eine der virtuellen Funktion rein virtuell ist, also mit =0 deklariert. Eine virtuelle Funktion allein macht keine Klasse abstrakt. Ausserdem dachte ich wir sprechen hier über eine abgeleitete Klasse -- in der kannst du natürlich die rein virtuellen Funktionen implementieren und dadurch die Klasse konkret machen.
also braucht sie auch keinen Konstruktor
Falsch. Die Klasse kann zwar nicht alleine instanziiert werden, aber als Basisklassensubobjekt in einer abgeleiteten Klasse. Der Konstruktor sollte also höchstens protected sein, aber nicht private.
das Problem ist bloß, dass ich nicht auf die protected Elemente zugreifen kann,
Natürlich kannst du. Deshalb sind sie ja protected und nicht private.
-
Bashar schrieb:
Falsch. Sie kann nicht instanziiert werden, falls eine der virtuellen Funktion rein virtuell ist, also mit =0 deklariert. Eine virtuelle Funktion allein macht keine Klasse abstrakt. Ausserdem dachte ich wir sprechen hier über eine abgeleitete Klasse -- in der kannst du natürlich die rein virtuellen Funktionen implementieren und dadurch die Klasse konkret machen.
Stimmt, aber sie ist auch rein virtuell
[quote="Bashar"]Falsch. Die Klasse kann zwar nicht alleine instanziiert werden, aber als Basisklassensubobjekt in einer abgeleiteten Klasse. Der Konstruktor sollte also höchstens protected sein, aber nicht private.
Jupp, hab ich "damals" nicht dran gedacht
[quote="Bashar"]Natürlich kannst du. Deshalb sind sie ja protected und nicht private.
Das hab ich auch gedacht, das ist jedenfalls der Grund dafür gewesen sie protected und nicht private zu machen, aber mein Compiler (VC++) meckert dennoch rum, Folgefehler ausgeschlossen????
Vielleicht liegt daran, dass ich das ganze in ne Initialisierungsliste gepackt hab (vom konstruktor), ich hab nä(h)mlich mal gelesen, dass das schneller sein soll, weis aber net so ganz, ich versuchs mal so
thx
Glamdring
-
Vielleicht liegt daran, dass ich das ganze in ne Initialisierungsliste gepackt hab (vom konstruktor), ich hab nä(h)mlich mal gelesen, dass das schneller sein soll, weis aber net so ganz, ich versuchs mal so
Genau daran liegts. Die Felder der Basisklasse müssen auch vom Basisklassenkonstruktor initialisiert werden.
-
Ja, habs grad getestet und jetzt gehts, danke an alle
mfg
Glamdring