virtual --> const???



  • Hi,

    also das hab ich noch in der Schule gelernt, dass man eine Methode als const definieren muss, wenn man eine virtuelle Methode überschreibt... aber wozu das ganze? Wenn ich dann in der überschreibenden Methode auf ein Member der abgeleiteten Klasse schreibend zugreifen will, dann bekomm ich eine Fehlermeldung (klar, ist ja auch als const definiert).

    In meinem Fall will ich vom Interface IStream erben und die virtuelle Methode Seek() überschreiben. Wenn ich die überschreibende Methode nicht als const definiere, dann bekomm ich einen Fehler vom Compiler:

    Fehler 1 error C2695: 'MyStream::Seek': Die überschreibende virtuelle Funktion unterscheidet sich von 'IStream::Seek' nur durch die Aufrufkonvention

    Nur, wenn ich const hinschreibe, dann verschwindet zwar der Fehler, aber dafür kann ich nicht mehr schreiben auf die Mitglieder der Klasse zugreifen.
    Weiß da evtl. einer von euch eine Lösung?

    Danke!



  • ich denke du hast da etwas falsch verstanden, wenn die methode mit const deklariert wurde und du sie überschreiben möchtest dann musst sie natürlich auch mit const definieren. hast dann natürlich keinen zugriff auf die member (abgesehen von mutable)



  • Naja gut, und was soll ich jetzt machen? Ich will das Interface implementieren und kann nix damit anfangen, weil der Member const ist...



  • So ist übrigens dir Original-Definition:

    public:
    virtual /* [local] */ HRESULT STDMETHODCALLTYPE Seek(
    /* [in] */ LARGE_INTEGER dlibMove,
    /* [in] */ DWORD dwOrigin,
    /* [out] */ ULARGE_INTEGER *plibNewPosition) = 0;



  • Die Aufrufkonvention, über die dein Compiler gestolpert ist, hat nichts mit 'const' zu tun (allerdings erzeugt das eine neue Methode, die der Compiler von der alten unterscheiden kann). Dein Problem liegt an dem "STDMETHODCALLTYPE" in der ursprünglichen Definition - das mußt du bei einer Überschreibung auch mit übernehmen.

    (PS: Für Insider: Die "Aufrufkonvention" erklärt dem Compiler, wo und wie die Parameter übergeben werden und wer am Ende der Funktion den Programmstack wieder freiräumen will. Wenn sich die Beteiligten darüber nicht einig sind, gibt's Probleme)



  • Danke für die Hilfe, hat mir sehr geholfen!
    Jetzt funktioniert's jedenfalls perfekt. Das nächste mal besser auf die originale Definistion schauen 😃


Anmelden zum Antworten