[erledigt] Kann virtuellen Desktruktor nicht aus abgeleiteter Klasse aufrufen

  • Hallo Leute,


    in meinem ExtRecMenu-Plugin habe ich eine Klasse myReplayControl, die von der VDR-Klasse cReplayControl abgeleitet ist. Wenn ich jetzt folgendes mache:

    spuckt der Compiler folgende Fehlermeldung aus:

    Code
    g++ -fPIC -g -O2 -Wall -Woverloaded-virtual -c -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"extrecmenu"' -I../../../include myreplaycontrol.c
    myreplaycontrol.c: In destructor »virtual myReplayControl::~myReplayControl()«:
    myreplaycontrol.c:13: Fehler: keine passende Funktion für Aufruf von »myReplayControl::cReplayControl()«
    ../../../include/vdr/menu.h:247: Anmerkung: Kandidaten sind: virtual cReplayControl::~cReplayControl()
    make: *** [myreplaycontrol.o] Fehler 1

    Das einzige, was ich in dem Zusammenhang in Erfahrung gebracht habe ist, dass der Destruktor von cReplayControl virtual deklariert ist. Aber so richtig weiterhelfen tut mir das nicht :(


    Kann mir da jemand auf die Sprünge helfen? Habe schon mehrere Web-Sites zu C++ bemüht, aber nichts gefunden.


    Gruß
    Nordlicht

  • Hi Nordlicht,



    warum willst du den explizit aufrufen?
    Nach der Ausführung von myReplayControl::~myReplayControl() (deinem Destruktor) wird automatisch der Destruktor der abgeleiteten Klassen aufgerufen, wenn dieser als "virtual" deklariert wurde.


    Ich glaube jedoch, für dieses Verhalten musst du deinen Destruktor noch als virtual deklarieren, bin mir hier aber nicht 100%ig sicher. Schaden kann es jedenfalls nicht und schon wirst du oben beschriebenes Verhalten erzeugen - was du ja offensichtlich auch möchtest?


    Der direkte Aufruf eines Destruktors ist generell nicht zu empfehlen und eben auch nicht notwendig. Falls du den Aufruf aus einem anderen Grund als während dem Abräumen des Objektes durchführst, solltest du diese Funktionalität in eine eigene Funktion (z.B. ::clear()) auslagern und dann diese aufrufen...



    Schöne Grüße
    Micha

  • Hi Callisto,


    Zitat

    Nach der Ausführung von myReplayControl::~myReplayControl() (deinem Destruktor) wird automatisch der Destruktor der abgeleiteten Klassen aufgerufen, wenn dieser als "virtual" deklariert wurde.

    So einfach ist das? Muss ehrlich sagen, dass mir die Möglichkeiten, die man mit C++ hat, sehr gefallen, aber da ich von C umgestiegen bin, tue ich mich doch ab und zu etwas schwer. Auf jeden Fall vielen Dank für den Hinweis, werde ich gleich mal ausprobieren.


    [edit]Klappt jetzt genau so, wie ich es haben will. Vielen Dank nochmal![/edit]


    Gruß
    Nordlicht

  • So Zeugs finde ich auch ganz nett.....nur muss man da ein bissele Bücher wälzen bis man rausfindet was es da nettes gibt.... bis ich geblickt habe wie die sache mit "virtueller Bindung" funktioniert habe ich die 10 Seiten in meinem Buch mehrere Tage lang gelesen.......
    Aber ohne die Hilfe von LordJaxom hätts bestimmt noch länger gedauert...

    Aktuelle Systeme:
    VDR-Server: MSI KT6A Ultra FISR ; Athlon XP 2200+ ; GrKa Geforce 2 MX; 256MB DDR-SDRam Plugins: streamdev-server, remote
    2 x DVB-Budget Karte, Gentoo, Kernel 2.6.8 usw....

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!