pure virtual function Definition
-
Es soll ja moeglich sein, dass eine pure virtual function in der selben Klasse definiert wird, die sie auch deklariert. Kann mir jemand ein Beispiel dafuer geben?
(Jenes mit dem pure virtual Dtor in einer ABC kenn ich schon)
-
#include <iostream> class A { public: virtual void do_ () = 0; }; void A::do_ () { std::cout << "42!" << std::endl; } class B : public A { public: virtual void do_ () { A::do_ (); } }; int main () { A* b = new B; b->do_ (); delete b; }
-
Raptor schrieb:
Es soll ja moeglich sein, dass eine pure virtual function in der selben Klasse definiert wird, die sie auch deklariert. Kann mir jemand ein Beispiel dafuer geben?
(Jenes mit dem pure virtual Dtor in einer ABC kenn ich schon)Machbar ist es, aber es ist danach keine 'pure virtual Method' mehr, sondern nur eine 'virtual Method'.
Pure virtual Destruktoren machen beim GNU (4.0) Probleme, da sie dann nicht als Funktion definiert werden. Wie mir scheint, macht der GNU die vTable allerdings von dem Sourcecode abhängig, in der der Destruktor definiert wird. Ohne definierten Destruktor keine vTable, ohne vTable viele unschöne Linkerfehler.
-
Xin schrieb:
Machbar ist es, aber es ist danach keine 'pure virtual Method' mehr, sondern nur eine 'virtual Method'.
Das ist eine Lüge ;). Im Ernst, schau dir den Code oben an. Wenn du die virtuelle Funktion in B nicht definierst, sagt dir der Compiler die Meinung. Trotzdem ist die Funktion für A definiert.
-
.filmor schrieb:
Xin schrieb:
Machbar ist es, aber es ist danach keine 'pure virtual Method' mehr, sondern nur eine 'virtual Method'.
Das ist eine Lüge ;). Im Ernst, schau dir den Code oben an. Wenn du die virtuelle Funktion in B nicht definierst, sagt dir der Compiler die Meinung. Trotzdem ist die Funktion für A definiert.
Eine Lüge ist das definitiv nicht, mein Text wurde nach besten Wissen und Gewissen geschrieben.
Das garantiert aber natürlich nicht, dass es richtig ist.Hmm... allerdings klingt Deine Antwort definitiv nicht unlogisch, wenngleich mir kein grade sinnvoller Einsatz dafür einfällt.
Aber auch das muss nix heißen. Ich kann heute also mit dem Wissen heimkehren, dass ich wieder was gelernt habe
-
Naja, im Prinzip setzt man das wohl da ein, wo man (wie auch bei "normalen" virtuellen Funktionen) dem Nutzer eine Standardimplementierung mitgeben möchte, in diesem Fall aber so, das der sich auf jeden Fall näher damit auseinandersetzt. Um die Implementierung der Basisklasse zu nutzen muss er schließlich dennoch die Methode implementieren, was wohl mehr Aufmerksamkeit fordert, als ein simples Weglassen.
Etwas Konkretes hab ich aber auch nicht anzubieten, ich hab das glaub ich noch nie verwendet ...
-
Naja, anzubieten haette ich schon eins, aber das kannte ich ja schon vorher.
class Base { public: Base(); virtual ~Base() = 0; }; Base::Base() { } Base::~Base() { } class Derived : public Base { public: Derived(); }; Derived::Derived() throw() : Base() { } int main() { Derived d; }Hier muss eine Definition des als pure virtual deklarierten Dtors angegeben werden, weil der Dtor von Derived den von Base automatisch aufruft. Ist keine Definition vorhanden gibts Linker-Errors.
-
Eigentlich ist das schon recht theoretisch. Wann benötigst du einen abstrakten Destruktor?
-
Wenn du genau so eine Klasse Base hier oben hast, sie aber abstrakt sein soll. Du hast ja außer dem Destruktor keine weitere Funktion, die du pur virtual machen kannst.
Ich habe schon Definitionen für pur virtuelle Funktionen erzeugt, wenn ich dort etwas mache, was in jeder abgeleiteten Klasse auch durchgeführt werden soll. Dann kann man in der Funktion der abgeleiteten Klasse einfach die der Basisklasse aufrufen.
-
Wenn es wirklich in jeder abgeleiteten Klasse gemacht werden soll, dann implementiere ich die Methode als nicht virtuell, die dann eine virtuelle abstrakte protected do_ Methode aufruft, welche dann die basisklassenunabhängige Funktionalität enthält. Selber Effekt und man spart sich die nicht sehr aussagekräftige Zeile Base::mach_was (); in der Methode mach_was.
Das überzeugt mich nicht von dem sinnvollen Einsatz dieses Verfahrens.
Auch das andere Beispiel ist mir ein wenig zu sehr aus der Luft gegriffen. Zeig mir eine (real existierende) Klasse, die so gebaut ist.