[SOLVED] Vererbungsfehler "use of deleted function"



  • Hallo Forum 🙂

    ich habe ein Problem das ich nirgendswo finden konnte, oder vielleicht nicht richtig gesehen habe.

    Ich habe eine Abstrakteklasse "Mitarbeiter" und einige abgeleitete Klassen davon.

    Ich habe eine Klasse "Lieferant" das von nichts erbt, und eine Klasse "Befristeter_Mitarbeiter" der von "Mitarbeiter" erbt.

    So der Fehler tritt auf bei "Freier_Mitarbeiter" der von "Lieferant" und "Befristeter_Mitarbeiter" erbt.

    class Freier_Mitarbeiter : public Lieferant, public Befristeter_Angestellter
    {
    public:
        using Lieferant::Lieferant;
    };
    

    Wenn ich ein "Freier_Mitarbeiter" erstellen möchte, kommt der Fehler

    /home/anthony/QtProjects/PersonalVerwaltungPopup/personalverwaltung.cpp:38: error: use of deleted function 'Freier_Mitarbeiter::Freier_Mitarbeiter(QString, Adresse)'
    Mitarbeiter* m = new Freier_Mitarbeiter(name, address);
    ------------------------------------------------------------------^

    /home/anthony/QtProjects/PersonalVerwaltungPopup/lieferant.h:29: 'Freier_Mitarbeiter::Freier_Mitarbeiter(QString, Adresse)' is implicitly deleted because the default definition would be ill-formed:
    using Lieferant::Lieferant;
    -------------------^

    Ich hatte vorher keine Probleme mit diesen Programm, ich habe erst heute versucht eine neue Klasse eingebunden. Bisher habe ich immer den Konstruktor mit

    using
    

    geerbt.

    Falls es weiterhilft:
    ich habe die Klasse mit in der lieferant.h deklariert, weil es fast keine extra funktionalität mitbring.

    Hoffe ihr könnt mir helfen, falls ihr mehr braucht, nur fragen 🙂

    mfg neuling7



  • Und das sind alle Fehlermeldungen?
    Ich würde jetzt annehmen, dass Befristeter_Angestellter keinen Defaultkonstruktor hat.

    Die Vererbungshierarchie sieht aber auch ziemlich schwachsinnig aus. Ein freier Mitarbeiter ist ein Lieferant und ein befristeter Angestellter?



  • Hierarchie

    Mitarbeiter

    ->Befristeter
    ---->Praktikant

    ->Festangestellter
    ---->Leitender

    Lieferant (abstrakte klasse) erbt von nichts

    und freiert erbt von befristeter und lieferant,

    die logik dahinter ist ja erstmal nicht wichtig 😃

    aber alle unter mitarbeiter erben den konstruktor von Mitarbeiter
    und haben keine andere

    und was die fehlermeldungen angeht, ja sind noch ein paar, aber die bauen auf diesen Fehler auf.

    soll ich mehr code posten?

    mfg neuling7



  • neuling7 schrieb:

    aber alle unter mitarbeiter erben den konstruktor von Mitarbeiter
    und haben keine andere

    Also, wie vermutet, keinen Defaultkonstruktor.

    und was die fehlermeldungen angeht, ja sind noch ein paar, aber die bauen auf diesen Fehler auf.

    Das wird dann wohl auch in den Meldungen stehen, die du intelligenterweie weggelassem hast.


  • Mod

    neuling7 schrieb:

    Bisher habe ich immer den Konstruktor mit

    using
    

    geerbt.

    Wahrscheinlich keine gute Idee. using-Deklarationen, die sich auf Konstruktoren beziehen, deklarieren wirklich jeden geerbten Konstruktor, einschließlich derer, die mit an Sicherheit grenzender Wahrscheinlich sinnlos sind (z.B. Copy-/Move-konstruktoren der Basisklasse). In einer Liskovschen Vererbungshierarchie sind alle Basisklassen sowieso abstrakt und haben typischerweise keine komplex überladenen Konstruktoren. Und jede andere Form von Vererbung... fällt sowieso früher oder später auf die Füße.



  • Also, wie vermutet, keinen Defaultkonstruktor.

    DANKEEEE!!

    ich wusste nicht das man Defaultkonstruktor benoetigt :o

    wieso brauche ich die den? und wieso hat es ohne davor auch funktuniert? 😕



  • neuling7 schrieb:

    Also, wie vermutet, keinen Defaultkonstruktor.

    DANKEEEE!!

    ich wusste nicht das man Defaultkonstruktor benoetigt :o

    wieso brauche ich die den? und wieso hat es ohne davor auch funktuniert? 😕

    Man benötigt keine Defaultkonstruktoren. Man muss aber die Konstruktoren der Basisklasse(n) mit Werten füttern. Wenn du von zwei Basisklassen erbst, aber nur die Konstruktoren der einen Klasse per using als die eigenen definierst, braucht die andere eben einen, der keine Werte benötigt (aka Defaultkonstruktor). Vermutlich solltest du einen Konstruktor für Freier_Mitarbeiter schreiben, der die der Basisklassen passend aufruft.


Log in to reply