virtual
-
Hallo ich möchte gerne wissen ob eine virtuelle Methode einer Klasse in einer vererbten Klasse auch noch als virtual gilt.
Also etwas in der Art:
class base { virtual void foo(){} =0; }; class derived1 : public base { foo(){ tuwas;}; }; class derived2: public derived1 { foo(){ tu was anderes;}; }; int main() { base* item = new derived2; derived2.foo(); }was wird nun hier ausgeführt?
ich hab mal gelesen dass es dabei schwierigkeiten geben kann...
falls mein beispiel völlig abwegig ist lasse ich mch gerne belehren ^^
-
Und ich hab gelesen dass sobald eine Methode als virtuell deklariert ist das immer virtuell bleibt

Egal ob man das "virtual" in abgeleiteten Klassen dazu schreibt oder nicht.
Alles andere wäre ja auch Käse
-
aber ich kann die funktionen dann schon risikofrei benutzen oder?
-
shisha schrieb:
aber ich kann die funktionen dann schon risikofrei benutzen oder?
Ist aber nur erlaubt wenn du so einen Warnhinweis wie auf den Zigarettenschachteln daufklebst!

Was verstehst du im Zusammenhang mit Funktionen unter Risiko?
Wenn Basisklassen-Funktion virtual ist die abgeleitete nicht virtual wenn du auch kein virtual davor schreibst. Was spricht dagegen das in 2 Sekunden einfach auszuprobieren?

-
weil die probleme laut einigen online-tutorials meist im zusammenhang mit destruktorn auftreten, und ich wüsste nicht wie ich überprüfen kann ob speicher tatsächlich freigegeben wurde...
gute frage an dieser stelle ^^
-
Argh, sag das doch!
Beim Destruktor musst du IMMER ein virtual dazu schreiben. Denn der Destruktor von A heißt anders als der von B.
Bei Methoden ist das anders, die heißen immer gleich.Wenn du eine Objekt über einen Basisklassenzeiger verwaltest, werden alle NICHT virtuellen Funktionen von der Basisklasse genommen. Wenn nun der Destrukto nicht virtuell ist, wird auch direkt der der Basisklasse angesprungen. Dann hast du ein Problem.
Bei normalen Funktionen ala "void A::foo()" reicht es wenn die Basisklasse das virtual deklariert, dann sollte (einigermaßen aktuellen/guten Compiler) auch keine Trouble geben...
-
Virtuo schrieb:
Beim Destruktor musst du IMMER ein virtual dazu schreiben.
Quatsch, auch hier wird das "virtual" durch die Bank weiter vererbt.