abstrakte Methode mit Implementierung in Header-Datei?



  • Hi,

    ich habe eine abstrakte Methode, die aber eine Implementierung besitzt. Also:

    //Header
    struct Test {
        virtual void foo() =0;
    };
    
    //Impl
    Test::foo() {}
    

    Hintergrund ist, das alle abgeleiteten Klassen problemlos "parent"->foo() aufrufen können sollen.

    Nun möchte ich aus dieser Klasse eine Header-Only Datei machen. Allerdings compiliert folgendes nicht:

    struct Test {
        virtual void foo() =0 {};
    };
    

    Wie ist die Syntax dafür? Oder geht das nicht?



  • Lass die geschweiften Klammern weg, das ist ja gerade eine Definition.



  • Man hatte jetzt ja die Compilermeldung posten können, aber das wär ja zu viel arbeit.



  • HeaderOnly schrieb:

    Wie ist die Syntax dafür? Oder geht das nicht?

    Das steht in der Tat so in alten Büchern. Ja, die Compiler nahmen es an. Aber heute nicht mehr. (AFAIR war die ~AWOF(){} im ersten ecp noch in der Klasse, was ich übrigens klasse fand, keine Ahnung, was das soll, daß es jetzt nicht mehr geht.)

    Kannste die Implemetierung nach der Klasse erst anbieten, aber noch im Header als inline-Funktion?



  • kingcools schrieb:

    Lass die geschweiften Klammern weg, das ist ja gerade eine Definition.

    Er braucht die (übrigens allervermutlichst nichtleere, sonst machts ja keinen Sinn) Definition für

    class SptFrFlgzg:public Test{
       void foo(){
          //Och, meine SptFr40 hat keine Specialithäten, darf die 
          //Default-Implementierung nehmen. VOH, 27.2.14
          return Test::foo();
       }
    };
    

    An sich kein schlechter Ort, um eine Default-Implementierung unterzubringen. Aber bin mir nicht so sicher, ob die Kollegen dem folgen können und wollen, daß eine implementierte pur virtuelle Funktion logischerweise die Default-Implementierung für die Erben ist. Man könnte auch konservativ eine defaultFoo() anbieten, wäre allen Ärger los, oder?



  • volkard schrieb:

    Kannste die Implemetierung nach der Klasse erst anbieten, aber noch im Header als inline-Funktion?

    Ah, ja. Das geht natürlich auch noch. Danke!


Anmelden zum Antworten