Mehrfachvererbung: Variable is "ambigious"



  • Hallo ihr Lieben,
    ich habe folgendes Problem:
    Eine Mehrfachvererbung, die für anschließend erklärtes Problem sorgt:

    using namespace std;
    
    class Person
    {
    public:
        string Name;
        string Geburtsdatum;
        string Anschrift;
    };
    
    class Student : public Person
    {
    public:
        string Matrikelnummer;
        string Studienfach;
    };
    
    class Mitarbeiter : public Person
    {
    public:
        double Gehalt;
        string Arbeitsgebiet;
    };
    
    class HiWi : public Student, public Mitarbeiter
    {
    };
    
    
    int main()
    {
        HiWi h;
        h.Name = "Max";
        h.Geburtsdatum = "01.01.2000";
        h.Anschrift = "Musterstrasse_1";
        h.Matrikelnummer = "0815";
        h.Studienfach = "BWL";
        h.Gehalt = 2500.67;
        h.Arbeitsgebiet = "Quantenphysik";
        
        return 0;
    }
    

    So wie es jetzt da steht, klappt es nicht. Name, Geburtsdatum und Anschrift seien "ambigious", also mehrdeutig.
    Nun verstehe ich es so:
    Der HiWi hat ja sowohl vom Studenten als auch vom Mitarbeiter die Variablen geerbt. Daher ist es eben doppelt.
    Die Lösung kann doch nicht sein, dass ich jetzt sowohl

    h.::Mitarbeiter.Name = "Max";
    

    als auch

    h.Student::Name = "Max";
    

    schreibe. An sich will ich ja, dass die betroffenen Variablen beider Klassen als eine gesehen werden. Wie mache ich das?

    Ich bin dankbar für jeden Hinweis, vielen Dank!



  • Du hast das dreaded diamond Problem, du kannst das durch virtuelle Vererbung lösen.

    class HiWi : virtual public Student, virtual public Mitarbeiter
    {
    };
    

    PS:
    using namespace std (oder generell using namespace ...) in Header Dateien ist ein no-go, das solltest du dir nicht angewöhnen.



  • Das geht mit https://en.wikipedia.org/wiki/Virtual_inheritance

    Du solltest in der Basisklasse unbedingt einen virtuellen Destruktor haben. Und dann überlegen, ob die Modellierung so toll ist. Mehrfachvererbung würde ich versuchen zu vermeiden, sofern eine der Klassen nicht eine reine Interfaceklasse ist.



  • @DocShoe: Dein Code ist nicht ganz richtig so. Es müssen jeweils die beiden Basisklassen Person als virtual deklariert werden:

    class Student : virtual public Person
    // sowie
    class Mitarbeiter : virtual public Person
    


  • Hallo @Hawaiihemd,
    Denke bei Deinem Entwurf mal darüber nach, ob ggf. eine Aggregation von "Person" zu mehreren Objekten einer Klasse "Rolle" o.ä. besser wäre. Von "Rolle" könnten dann ggf. "Student" und "Mitarbeiter" abgeleitet sein.
    Eine Person kann in der Realität auch mehrere Rollen haben. Z.B. ist es möglich, das eine Person gleichzeitig Mitarbeiter und Student ist.
    In den meisten Fällen kann eine Doppelvererbung vermieden werden.



  • Vielen dank ihr Lieben. Da waren sehr viele sehr nützliche Hinweise dabei.
    Jeder von Euch hat für einen Mehrwert bei mir gesorgt!!!



  • -Was falsch verstandenes entfernt-



  • @Th69 sagte in Mehrfachvererbung: Variable is "ambigious":

    @DocShoe: Dein Code ist nicht ganz richtig so. Es müssen jeweils die beiden Basisklassen Person als virtual deklariert werden:

    class Student : virtual public Person
    // sowie
    class Mitarbeiter : virtual public Person
    

    Das war Hausaufgabe für Kollege Hawaiihemd 😉



  • Dieser Beitrag wurde gelöscht!

Anmelden zum Antworten