abstarakte Klasse (einfach)
-
Hallo,
ich habe folgendes Verstaendnisproblem: "eine abstrakte Klasse ist eine Klasse die mindestens eine rein virtuelle Funktion enthaelt" so hab ich das gelernt und hernehmen kann man sie wenn man zB fuer mind zwei versch. Klasse die gleiche Schnittstelle hat, als Basis, da man sie selber ja nicht instanziieren kann.
Enthaelt eine abstrakte Klasse nur die Deklarationen (= also nur ihren Namen) seiner Funktionen, oder kann man diese in ihr auch schon definieren (= den Inhalt festlegen)?
Wenn ich in einer Klasse nur eine rein virtuelle (also mit 'virtual' und '=0' deklarierte)Funktion habe, kann ich dann die anderen Funktionen trotzdem schon definieren?
-
Du kannst alle Funktionen definieren bis auf die pure virtuellen. Der Destruktor ist da eine Ausnahme er MUSS sogar dafiniert werden wenn er pure virtuell ist.
-
Du kannst alle Funktionen definieren bis auf die pure virtuellen
Das ist falsch. Jede rein virtuelle Methode kann eine Implementation besitzen. Rein virtuell heißt *nicht*, dass eine solche Methode keine Implementation besitzt. Rein virtuell heißt nur, dass diese Methode überschrieben werden muss, damit eine abgeleitete Klasse instanziierbar sein kann und dass eine solche Methode *niemals* über dynamische Bindung ausgewählt werden kann. Es ist aber kein Problem eine solche Methode über statische Bindung aufzufrufen:
class Abstract { public: virtual void Func() = 0; }; void Abstract::Func() { cout << "Default-Impl" << endl; } class Concrete : public Abstract { public: void Func() { cout << "Meine-Impl" << endl; // Aufruf der rein virtuellen Mehtode von Abstract Abstract::Func(); } }; int main() { Concrete c; Abstract& a = c; a.Func(); }
[ Dieser Beitrag wurde am 18.03.2003 um 15:24 Uhr von HumeSikkins editiert. ]
-
Impl
-
Impl=Implementation
-
@HumeSikkins
Danke,
dh also ich muss um a.func() aufzurufen aber dennoch vorher den Inhalt von einem Objekt c der abgeleiteten Klasse auf die Adresse eines (Basisklassen-)Objektes a zuweisen um die Funktion func() der >Basis< aufzurufen???Geht das nur so? (also vorher Objekt c und Zuweisung auf &a)
Warum kann man denn eigentlich nicht nur 'Abstract::Func()' direkt aufrufen?
Ich kann also die Funktionen der abstrakten Basis ausimplementieren, aber muss sie, wenn sie rein virtuell sind dann in einer abgeleiteten Klasse wieder ueberschreiben?
(ich hoffe man versteht meine Formulierungen #&%$§)