Vererbte Funktion nicht überschrieben im Header aber implementiert im Program -> Fehlermeldung



  • Im folgenden Code Beispiel bekomme ich die Fehlermeldung, dass Y::func() nicht definiert sei. Ich hätte erwartet, dass dies kompiliert, schließlich wird die Funktion vererbt. Gibt es einen Grund warum das nicht geht?

    // header.h
    class X {
    public:
      virtual void func() = 0;
    };
    
    class Y : public X {
    public:
      //void func();
    };
    
    #include "header.h"
    
    void Y::func() {}
    
    int main() {
      return 0;
    }
    

  • Mod

    Das sind eben einfach die Regeln der Sprache. Finde ich auch sehr sinnvoll so, schließlich hat Y die von X geerbte Methode, aber du hast nicht deklariert, dass Y auch eine eigene func() haben soll. Deine darauf folgende Definition von Y::func() schaut daher wie ein Fehler aus.



  • Antoras schrieb:

    Gibt es einen Grund warum das nicht geht?

    Der Grund ist natürlich dass der Standard sagt dass es nicht geht.
    Und der Standard sagt das vermutlich, weil es ziemlich doof wäre wenn es gehen würde.



  • Es wird nur X::func vererbt, Y::func kennt er nicht.



  • Gut, ok. Ich hatte gedacht vielleicht gibt es ja einen offensichtlichen syntaktischen Grund wo es mehrdeutig ist oder so etwas in der Art.



  • Die erbenden Klassen, die nicht jede virtuelle Funktion per Hand redefinieren, wären offen gegenüber Code-Inkektion von außen.



  • Interessant, muss ich mir beizeiten mal anschauen was für Code der Compiler generiert.

    Edit: Ich hatte erwartet, dass der Compiler die virtuelle abstrakte Funktionen automatisch definiert in der Subklasse. Aber dem ist wohl nicht so.


Log in to reply