abstrakte Klasse
-
huhu ihrs,
ich habe eine Verständnisfrage, die ich schon im Java Bereich gestellt habe aber auf C++ genauso zutrifft und zwar:Von einer abstrakten Klasse kann man ja kein Objekt erzeugen.
Aber bei Vererbung ruft der Konstruktor der abgeleiteten Klasse ja den der Basisklasse auf... wieso kann hierbei ein Objekt einer abstrakten Klasse erzeugen werden oO ?
#include <iostream> using namespace std; class A { public: A() { cout << "A"; } virtual void fkt() = 0; }; class B : public A { public: B() : A() {} void fkt() {} }; int main() { B b; // Ausgabe: A system("pause>nul"); return 0; }danke euch schonmal

-
Dweb schrieb:
Von einer abstrakten Klasse kann man ja kein Objekt erzeugen.
Nicht ganz. Es kann kein Objekt dieses Typs erstellt werden, dass nicht Basisklassensubobjekt eines anderen Objektes ist (abgesehen vom Zeitraum zwischen Ende der Konstruktion des Subobjektes und Ende der Konstruktion des abgeleiteten Objektes, bzw. umgekehrt analog bei der Zerstörung).
-
Es wird ja kein Objekt der abstrakten Basisklasse erzeugt, es wird nur der Basisteil der erbenden Klasse initialisiert. Wenn das nicht geschehen könnte gäbe es ein riesen Problem!
Das Problem ist, dass nicht implementierte pure-virtual-Funktionen nicht aufgerufen werden können! Ein Objekt dieser Klasse hätten keinen Sinn und würde auch nicht funktionierten. Trotzdem kann es sehr gut möglich sein, dass ein Konstruktor existiert (diese können nicht virtuell und damit auch nicht pure virtual sein), der Variablen initialisieren muss.
-
Von einer abstrakten Klasse kann man ja kein Objekt erzeugen
Eben nicht direkt.
Du kannst es nicht ueber direkte Instanzierung (new oder aufn stack) erzeugen. Der compiler kann es aber schon (inderekt). Weil prinzipiell hat er alles was er braucht, bis auf gültige funktionspointer fuer die abstrakten methoden. Und die liefert dir natuerlich deine abgeleitete klasse und deswegen kann der compiler deine abstrakte basisklasse nur indirekt über ne ableitung erzeugen.Trotzdem kann es sehr gut möglich sein, dass ein Konstruktor existiert
Existiert kein im context verfügbarer konstruktor, kann der compiler auch ned ableiten.
welchen CTor du verwendest, kannst du über die Initliste bestimmen. Ansonsten funktioniert das wie ausserhalb der vererbung auch (nur das es hier extra ein protected gibt fuer die abgeleiteten klassen), kommst auf keinen Ctor drauf, kann dir der compiler auch keine instanz erzeugen.
Zu beachten iss nur, das der compiler auch selber konstruktoren erzeugt, falls bestimmte ned vorhanden sind.Ciao ...
Ciao ...