Initialisierung von Attributen abstrakter Klassen
-
Wenn ich eine abstrakte Basisklasse habe, von der ich aber noch bestimmte Methoden und Atribute verwenden will, wie mache ich es dann, um die Attribute zu initialisieren? Es wird ja nie ein Konstruktor aufgerufen
class BasisKlasse{ int attribut; //wie dies Intialisieren protected: void setattribut(int a){attribut*=attribut;} //hierfür muss es ja initialisiert sein public: virtual int getattribut() const =0; };
Vielen Dank im voraus.
-
Doch, ein Konstruktor wird aufgerufen, und zwar vom Konstruktor der abgeleiteten Klasse.
EDIT:
Aber welchen Sinn macht ein privates Attribut welches nicht benutzt und nicht zurückgegeben wird (getAttribut ist ja abstrakt)? :p
-
Wenn so ein objekt niemals konstruiert wird, dann kannst du auf dein attribut ja auch niemals zugreifen...
falls es doch konstruiert werden soll: mach das "=0" bei der virtuellen funktion weg, und pass auf, dass du bei den abgeleiteten klassen die funktion überschreibst
(
bin selbst nich so fit aufm gebiet, kann mich irren
)
edit:
Doch, ein Konstruktor wird aufgerufen, und zwar vom Konstruktor der abgeleiteten Klasse.
aber man kan keine instanz der BasisKlasse erzeugen, das geht nich:
BasikKlasse einUnmöglichesObjekt; //dafür aber das: BasisKlasse *polymorphPointer;
oder?...
-
Danke LordJaxom,das hatte ich vergessen.
Keine Sorge, eigentlich sind die getter und setter protected und andere methoden pure virtuel public.
-
Öhm.
Wieso verpasst du der abstrakten Klasse nicht einfach einen Konstruktor? Check' ich jetzt nicht ganz...
-
Auch abstrakte Klassen werden normal konstruiert, haben also auch Konstruktor und Destruktor, die zu den üblichen Zeiten ausgeführt werden. Abstrakt bedeutet nicht, dass es keine Objekte dieser Klasse geben kann, sondern nur, dass diese Objekte nur als Subobjekte einer davon abgeleiteten Klasse auftreten können.
-
@hustbaer: eben ganz einfach weil bei mir der Gedanke war: abstrakt-> es können keine Instanzen angelegt werden-> kein Konstruktor.
Nachdem ich LordJaxoms Post gelesen habe hab ich mir auch erst mal gegen die Stirn geschlagen, weil ich das vergessen hatte.
Vielen Dank an alle, Problem gelöst.