Welche pure virtual Methoden muss man implementieren?
-
Ich nehme mal Bezug auf volkards Frage in folgendem Thread: http://www.c-plusplus.net/forum/viewtopic.php?t=75251
Da mir spontan dazu nichts eingefallen aber wissbegierig bin, kann mir das hier hoffentlich jemand beantworten
Ich hab auch schon ein wenig mit GUIs herumgespielt
MfG SideWinder
-
Soll ich es verraten ?
Nein, ich tus nicht:p
Devil
-
devil81 schrieb:
Soll ich es verraten ?
Nein, ich tus nicht:p
jaja, lieber nen thread drauswerden lassen,
der mit 20 seiten voller "warum denn"
und "bitte auflösen" posts vollgespamt wird
aber gut, du hast es nich anders gewollt:ja, warum denn
*wissen will*
bitte auflösen
-
In der Hoffnung auf einen Keks versuche ich es mal:
Pure virtual Methoden gibt es, um sicherzustellen, dass abgeleitete Klassen eine bestimmte Schnittstelle / einen bestimmten Dienst anbieten. Das wiederum führt dazu, dass man verschiedene abgeleiteten Klassen in einer gemeinsamen Datenstruktur speichern kann und die gemeinsamen Dienste nutzen kann.
Und implementieren muss man sie natürlich, wenn die Klasse konkret werden soll.
Ich hab auch schon ein wenig mit GUIs herumgespielt
Das ist aber gaaaaanz schlecht.
-
Oder war das so gemeint, dass man wirklich eine pure virtual Methode definiert? Das wäre auch gaaaanz schlecht.
Das mache ich nur manchmal, wenn ich will, dass die Methoden der abgeleiteten Klassen auch die (pure virtual deklarierte) Methode der Basisklasse aufrufen (und eben noch was anderes tun). Von "müssen" kann da aber keine Rede sein.
(außer man greift auf private Elemente dort zu?! Aber dann muss die Basisklassenmethode trotzdem nicht pure virtual sein.)
Oh Gott, ich verwirre mich selbst.
-
Ich hoffe ich habe die Frage richtig verstanden und sage, daß die vier Methoden, die zur Klasse immer gehören auch implementiert werden müssen, wenn die Methode als virtual deklariert wurde. Stimmt's?
-
pure virtual meine ich natürlich, eine abstrakte Klasse muss also auch wie jede andere einen Konstr,Destr,Zuweis,Kopie haben (evtl. macht das der Compiler).
-
@devil81: Du weißt es ja gar nicht :p - wenn doch sags mir
Nein, weg bitte vom "Rate doch"-Thread, mich würde es wirklich interessieren
MfG SideWinder
-
Ganz ehrlich? Mir ist kein Fall bekannt!
Wenn ich eine Methode implementiere, muß sie doch schon Sinn machen, oder? Abstract mache ich eine Methode nur, wenn mir keine sinnvolle Implementieren einfällt, und ich möchte das sich der User meiner Klasse bitte darum kümmert. Sie aber sowohl abstract zu machen, als auch zu implementieren, sieht für mich nach einem Widerspruch aus.
ABER, ich bin lernfähig und lasse mich hier gerne aufklären, wann ein solcher eintreten würde.
Also, lasst mal die Infos rüberwachsen. Sowas wie "Ich weiß es, sag es aber nicht!" komme ich mir in einem erwachsenen Forum ziemlich verar*** vor.
-
SideWinder schrieb:
@devil81: Du weißt es ja gar nicht :p - wenn doch sags mir
Nein, weg bitte vom "Rate doch"-Thread, mich würde es wirklich interessieren
MfG SideWinder
Und ich weiss es doch.
Entweder keine oder alle.
Eine Methode ist dann pure Virtual, wenn sie keinen rumpf hat, und virtual ist:class base { virutal void myfunc()=0;//pure virtual };
Ergo, sie muss in ihrer Abstrakten Klasse nicht implementiert werden,
da sie sonst nicht mehr pure wäre.Wenn du allerdings jetzt von base ableitest, dann MUSST du alle pure Virtual
Methoden überschreiben, also implementieren, wenn du die Klasse instanzieren willst.class child : public base { virtual void myfunc(){/*do something*/} };
Devil
-
Hä??? Was ist das denn? Das sind doch alles Basics!!!!!! Es ging um was anderes: die Methode in der Basisklasse ist sowohl Abstract als AUCH implementiert!
Das was du gezeigt hast, habe ich schon beschrieben und das steht in jedem OO-Einsteigerbuch drin. Und das weiß auch jeder der OO auch nur ansatzweise verstanden hat.
Also, ich warte immernoch auf DIE ultimative Lösung der berechtigten Frage von SideWinder! Wobei, warum beantwortet Volkard die Frage nicht, die er doch selber provokativ gestellt hat?
-
Im übrigen, bezogen auf GUIs (und das hast du devil leider immer noch nicht beantwortet) handelt es sich um die Zeichnungsfunktion der GUI-Elemente:
class BaseWidget { public: virtual void paintWidget() = 0; // Keine Ahnung wie die Widgets aussehen sollen. };
class ButtonWidget : public BaseWidget { public: void paintWidget(); // Nur der Button weiß, wie er sich zeichnen soll. };
Das ist aber noch lange nicht das, was Volkard gefragt hat.
-
Artchi schrieb:
die Methode in der Basisklasse ist sowohl Abstract als AUCH implementiert!
Beweise.
Devil
-
Also bis jetzt sehe ich keine Antwort auf die Frage, deshalb bleibe ich bei meiner Theorie.
-
Wie "Beweise"? Ich sage das ja nicht! Das sagt Volkard! Er hat doch gesagt, das jemand, der mit GUI-Programmierung anfängt, kein solches Beispiel liefern kann (welches auch ich NICHT kenne, wie oben von mir bereits gesagt). Dann hat SideWinder hier gefragt, ob jemand ein Beispiel liefern kann. Ich kenne keines, wie es Volkard fordert. Ich kenne nur mein oben gebrachtes Beispiel.
Letztendlich weiß es hier anscheinend keiner. Ich will dir nur sagen, das was du und ich als Beispiele gebracht haben, nicht das ist, was Volkard will. Alles klar?
-
lol!
ihr habt echt zu vel am farbtopf geschnuppert.den pur virtuellen basisklassendestruktor MUSS man implemetieren, denn er WIRD (vom abgeleiteten destruktor) aufgerufen.
-
volkard schrieb:
lol!
ihr habt echt zu vel am farbtopf geschnuppert.den pur virtuellen basisklassendestruktor MUSS man implemetieren, denn er WIRD (vom abgeleiteten destruktor) aufgerufen.
Jetzt hätte ich dafür gerne ein sinnvolles Beispiel, damit es auch alle verstehen
Devil
-
Strogij schrieb:
pure virtual meine ich natürlich, eine abstrakte Klasse muss also auch wie jede andere einen Konstr,Destr,Zuweis,Kopie haben (evtl. macht das der Compiler).
Die drei anderen, Konstruktor, Koperkonstruktor und Zuweisungsoperator wirste nicht virtuell hinkriegen. Das hatte sowenig mit pur virtuell zu tun, daß keiner mehr auf deinen richtigen Teilvorschlag mit dem Destruktor einging.
Gehe ich recht in der Annhame, daß Du noch nicht GUI programmerst?
-
volkard schrieb:
lol!
ihr habt echt zu vel am farbtopf geschnuppert.den pur virtuellen basisklassendestruktor MUSS man implemetieren, denn er WIRD (vom abgeleiteten destruktor) aufgerufen.
Ich möchte das jetzt so vorsichtig wie nur irgendmöglich ausdrücken:
Ich finde diese Frage nicht geeignetm um zu prüfen, ob jemand OOP verstanden hat.
-
devil81 schrieb:
Jetzt hätte ich dafür gerne ein sinnvolles Beispiel, damit es auch alle verstehen
If the class should be abstract (you want to prevent instantiating it) but it doesn't happen to have any other pure virtual functions, a common technique to make the destructor pure virtual.
http://www.gotw.ca/gotw/031.htm
reicht es, wenn sutter "common techniqe" sagt?