Problem mit virtuellen Methoden und die Implementierungen



  • Bei einer abstrakten Basisklasse habe ich:

    virtual void f() = 0 {}
    

    Muss da unbedingt die Implementation von f sein?
    Wenn ich schreibe:

    virtual void f() = 0;
    

    meckert der Compiler wenn p_base->f() aufgerufen wird.



  • virtual void f() = 0 {}
    

    Das sollte doch gar nicht möglich sein? "= 0" meint doch schon, dass eben keine Definition vorhanden ist.
    Du musst eine konkrete Klasse bilden, also eine Klasse von der abstrakten Basisklasse ableiten, welche mindestens eine Methode definiert.

    MfG



  • nein!

    die klammern muessen weg.

    class Base
    {
    public:
      virtual ~Base() {} //NICHT vergessen, wenn du speicherleichen vermeiden möchtest
      void pure_abstract() = 0;
    };
    class Derived public Base
    {
    public:
      void pure_abstract() { /*impl*/ }
    };
    ...
    Base* ptr = new Derived;
    ptr->pure_abstract(); //<-- wuppt
    


  • es ist allerdings sehr wohl möglich, auch rein virtuellen funktionen eine default-implementierung zu geben, allerdings ist es nicht erlaubt, bei die funktion bei ihrer deklaration gleichzeitig als rein virtuell zu markieren und zu definieren.

    notwendig ist das beispielsweise bei rein virtuellen destruktoren, die dennoch definiert werden müssen.



  • queer_boy schrieb:

    allerdings ist es nicht erlaubt, bei die funktion bei ihrer deklaration gleichzeitig als rein virtuell zu markieren und zu definieren ...

    ... doch eine Compiler unterstützen diese Syntax



  • KasF schrieb:

    queer_boy schrieb:

    allerdings ist es nicht erlaubt, bei die funktion bei ihrer deklaration gleichzeitig als rein virtuell zu markieren und zu definieren ...

    ... doch eine Compiler unterstützen diese Syntax

    also wenn du das visual studio verwendest und irgendwann nen GNU compiler anwirfst, dann wirst du dich wundern, WAS der cl.exe-compiler so alles schluckt 😃


Anmelden zum Antworten