TStream - Abstrakte Klasse???
-
Gar nicht.
Abstrakte Klasse bedeutet, dass es sich um eine Virtuelle Klasse handelt. Diese kann man nicht instanziieren. Du musst eine abgeleitete klasse verwenden, welche die Implementationen des definierten Interfaces enthält.
Siehe Objektorientierte Programmierung für Dummies | ISBN: 3826629841 in der Abhandlung zur "Generischen Programmierung" (Virtuelle Klassen, etc)-junix
-
Indem du die abtstrakten Methoden implementierst, so wie es die von TStream abgeleiteten Klassen machen (z.B. TMemoryStream)
Ups; Junix war schneller
-
Burkhi schrieb:
Ups; Junix war schneller
Aber deine Antwort war freundlicher und fachgerechter.
-
[EDIT]
@dschensky: mir ist leider ein Fehler unterlaufen. Ich wollte auf den Beitrag antworten, hab aber aus versehen auf "Editieren" geklickt und dein Beitrag überschrieben. Sei bitte nicht böse, war keine Absicht
Kannst du diesen Beitrag ncoh mal editieren und wieder herstellen ?
-
dschensky schrieb:
und mach Dich über abstrakte Klassen und (wie in der CBuilder-Hilfe zu TStream::TStream erwähnt) rein virtuelle Methoden schlau.
naja, du meinst wahrscheinlich rein virtuelle Klassen, welche aber keine abstrakte Klassen implizieren. Virtuelle Methoden sind immer virtual, weshalb "rein virtuelle Methoden" natürlich eine expizite Ausdrucksweise einer impliziten Notwendigkeit darstellt.
-
Andreas,
AndreasW schrieb:
naja, du meinst wahrscheinlich rein virtuelle Klassen...
nein, ich meine rein virtuelle Methoden.
AndreasW schrieb:
...welche aber keine abstrakte Klassen implizieren.
Ich denke doch:
Stroustrup, Abschnitt 12.3 schrieb:
Eine Klasse mit einer oder mehreren rein virtuellen Funktionen ist eine abstrakte Klasse.
Bsp.:
class X { void foo() = 0; }
foo ist eine rein virtuelle Methode und demzufolge X eine abstrakte Klasse.
AndreasW schrieb:
Virtuelle Methoden sind immer virtual...
Ich denke, das kann man so stehen lassen ...
AndreasW schrieb:
...weshalb "rein virtuelle Methoden" natürlich eine expizite Ausdrucksweise einer impliziten Notwendigkeit darstellt.
Also da ich gerade 3 Bier im Kopf habe, versuche ich morgen darüber nachzudenken ...
-
@dschensky... ich glaube dein Beispiel ist schlicht falsch (o;
-junix
-
junix,
junix schrieb:
@dschensky... ich glaube dein Beispiel ist schlicht falsch
Stimmt, ich habe natürlich das virtual vergessen.
class X { virtual void foo() = 0; }
-
dschensky schrieb:
class X { virtual void foo() = 0; }
Also, meines Erachtens ist das ein Interface. Eine abstrakte Klasse muß mindestens eine rein virtuelle Methode besitzen, hat im Normalfall aber auch
implementierte Methoden (die folglich nicht rein virtuell sein können).
Besitzt eine Klasse ausschließlich rein virtuelle Methoden, spricht man von
einem Interface. Dies trifft auf obige Klasse doch wohl zu.Gruß,
Alexander
-
Eigentlich wollte ich nur wissen, wie ich eine Instanz der Klasse TStream erzeugen kann, da man mir sagte, dass ich eine abgeleitete Klasse verwenden muss, wie z.B. TFileStream, etc. ist meine Frage beantwortet. Danke an dieser Stelle, und ruhet in Frieden
-
@dschensky:
abstrakt ist nicht gleich virtual. Abstrakte Funtkionen implizieren aber virtuelle Methoden, da sonst ja nie ne Instanz einer abstrakten Klasse erstellt werden können, da die vermeindlich nicht virtuelle Methode ja nie überschrieben werden kann. Deshalb ist eine abstrakte Methode immer virtual.
-
Hi,
ich habe das Gefühl, daß wir uns irgendwie alle einig sind, uns aber in komplizierten Formulierungen verwurschteln.
Also: Die CB-Hilfe zu TStream::TStream sagt, TStream kann nicht instanziiert werden, weil deren Deklaration rein virtuelle Funktionen enthält. Was nicht drin steht ist, daß TStream damit eine abstrakte Klasse ist.
Das ist es, was ich sagen wollte. Hier nochmal ein Zitat (bitte nicht wieder weg-editieren :-)):Stroustrup, Die C++ Programmiersprache schrieb:
Eine Klasse mit einer oder mehreren reinen virtuellen Funktionen nennt man abstrakte Klasse; von abstrakten Klassen dürfen keine Objekte erzeugt werden.
- kurz und schmerzlos.
AndreasW schrieb:
abstrakt ist nicht gleich virtual
Das ist mir schon klar.
-
Der OT-Teil geht hier weiter.