Mehrfachvererbung von Klassen mit gemeinsamer Basis



  • Oder das, es kommt drauf an, was Du haben willst. Soll der Basis-Anteil a zweimal oder nur einmal enthalten sein?



  • class a 
    { 
    } 
    
    class b : public virtual a 
    { 
    } 
    
    class c : public virtual a 
    { 
    } 
    
    class d : public b, public c 
    { 
        // Variablendefinitionen sind nicht mehrdeutig
    
        // Bekomm' ich hier Instanzen von b und c erzeugt, die
        // unabhaengig von einander agieren und konsistent sind?
    }
    

    zwette



  • Nein, bekommst Du nicht. Die beiden teilen sich ein a-Objekt. Wenn sie unabhängig sein sollen, dann ohne virtual und mit b:: bzw. c:: als Präfix auf die Klassenelemente zugreifen.

    MfG Jester



  • Hallo,
    bevor ich mehrfach von Klassen mit Daten erbe (und dann auch noch in der Dreaded diamond of death-Form), würde ich mir doch noch mal ganz genau mein Design anschauen. Sich das du das richtige Problem löst?



  • class planet
    {
    }
    
    class planetsystem : public virtual planet  
    {  
    }  
    
    class inhabitedplanet : public virtual planet  
    {  
    }  
    
    class inhabitedplanetsystem : public planetsystem, public inhabitedplanet  
    {
    }
    

    Denke, dass der Ansatz schon ok ist, oder? 😕

    zwette



  • Naja, in anbetracht der Tatsache, daß öffentliche Vererbung stets "ist ein" betrachtet lese ich Dir jetzt einfach mal Deinen Code vor:

    1)Ein Planetensystem ist ein Planet.
    2)Ein bewohnter Planet ist ein Planet.
    3)Ein bewohntes Planetensystem ist (gleichzeitig) ein Planet und ein bewohnter Planet.

    1. und 3) klingen nicht wirklich sinnvoll.

    zu 1) Ein Planetensystem enthält oder hat Planeten. Hier sollte man sich also überlegen, ob man nicht lieber eine Liste mit Planeten hält.

    1. ist wohl okay.

    2. ein bewohntes Planetensystem ist ein Planetensystem => davon erben. Dieses System bringt dann ja auch die Planeten mit...

    Macht es wirklich so einen großen Unterschied, ob ein Planet bewohnt ist, daß man es durch eine eigene Klasse modellieren muß? Genügt nicht vielleicht ein Flag? Aber das mußt Du wissen, ich kenne Deine Problemstellung nicht.

    MfG Jester



  • Das Projekt ist noch größer, ich umschreib es mal kurz, die Klassenhierarchie sieht folgendermaßen aus (es handelt sich ünbrigens um eine Belegarbeit für "Objektorientiertes Programmieren"):

    class celestialbody
    {
        // Himmelskoerper, ist abstrakt
    }
    
    class planet : public celestialbody
    {
        // Planet ist ein Himmelskoerper 
    }
    
    class star : public celestialbody
    {
        // Stern ist ein Himmelskoerper
    }
    
    class starsystem : public star
    {
        // Menge von Planeten + Muttergestirn
        // m_pvecPlanets = Liste von Pointern auf Objekte des Typs planet
    }
    
    class planetsystem : public virtual planet   
    {
        // Planetensystem
        // Hat(!!) Menge von Monden (Liste)
    }   
    
    class inhabitedplanet : public virtual planet   
    {
        // Bewohnter Planet ist ein Planet mit Bevölkerung und Völkernamen
    }   
    
    class inhabitedplanetsystem : public planetsystem, public inhabitedplanet   
    {
        // Planetensystem mit mindestens einem bewohnten Planet
    }
    

    zwette



  • Weiterhin kann ich Deinem Code entnehmen, daß ein Sternensystem ein Stern ist 😕.
    Egal wie groß das Projekt ist. Die Vererbung ist falsch eingesetzt, da beißt die Maus keinen Faden ab.

    MfG Jester



  • Sorry, aber kannst du mri mal kurz erklaeren warum ein starsystem ein star ist?
    Das kapier ich leider nicht.

    Ich wuerde sagen:
    ein Stern hat 0 bis N Planeten und jeder Planet hat 0 bis N Monde.

    Somit ergibt sich bei mir, dass deine *system Klassen nicht noetig sind.



  • Naja, wenn er mehrere Systeme haben will ist das ja durchaus angebracht, sie als Klassen zu modellieren...



  • Jester schrieb:

    Naja, wenn er mehrere Systeme haben will ist das ja durchaus angebracht, sie als Klassen zu modellieren...

    Kommt alles auf die Definition an.

    Man koennte ja auch sagen:

    Stern ist ein Himmelskoerper

    Sternensystem hat 1 bis N Sterne und 0 bis N Planeten

    Planet ist ein Himmelskoerper
    Planet hat 1 Parent-Himmelskoerper (um den er kreist) und 0 bis N Planeten (Denn ein 'Mond' kann auch wieder Monde haben)

    Aber wir sind uns einig, dass das momentane Design irgendwie nicht ganz passt...



  • Jester schrieb:

    Die Vererbung ist falsch eingesetzt, da beißt die Maus keinen Faden ab.

    Wo ist denn da was falsch? Verwechselst Du das nicht mit "die Vererbung hätte ich logisch anders vorgenommen"? 🕶 Ich möchte das gerne so vererben, und es funktioniert auch, nur eben unten bei der Mehrfachvererbung nicht.

    zwette



  • Ja, das ist klar. nur er könnte mehrere Planetensysteme haben sowas wie das in dem wir leben halt. Und verschiedene Sternensysteme (=Galaxien) wie zum Milchstraße... andere fallen mir grad keine namentlich ein. Aber geben tut's die. Ich glaube das will er modellieren.



  • Galaxie hat 0 bis N Sternensysteme

    Sorry - aber da brauche ich auch wieder keine Ableitung...

    Ich brauche lediglich
    Stern und Planet als Himmelskoerper, wobei Planet ein Parent (uU ist das Parent nicht noetig) und 0 bis N weitere Planeten besitzt. Damit laesst sich so ziemlich alles darstellen.

    Denn vergiss nicht: ein Sternensystem (so wie unseres) kann 1 bis N Sonnen haben (zB eine Doppelsonne)
    Somit kann Sternensystem nicht von Stern erben.



  • Binärsysteme oder höherangige Systeme (Systeme mit mehreren Sonnen) haben höchstwahrscheinlich keine Planeten, da die komplexeren Schwerkraftfelder stabile Planetenbahnen verhindern. 🕶

    zwette



  • @zwette: Willst Du was lernen und es besser machen oder Dein "Design" vor uns verteidigen? Deine Verwendung von Vererbung ist schlicht falsch, warum haben wir schon lange begründet. Wenn Du das so lassen willst ist das okay, hab ich kein Problem damit. Aber tu bitte nicht so, als sei das alles wunderbar in Ordnung und wir sollten uns nicht so damit anstellen.

    MfG Jester



  • zwette schrieb:

    Binärsysteme oder höherangige Systeme (Systeme mit mehreren Sonnen) haben höchstwahrscheinlich keine Planeten, da die komplexeren Schwerkraftfelder stabile Planetenbahnen verhindern. 🕶

    Man beachte deswegen
    Sternensystem hat 1 bis N Sterne und 0 bis N Planeten



  • zwette schrieb:

    (es handelt sich ünbrigens um eine Belegarbeit für "Objektorientiertes Programmieren")

    Da sollte man solche Schnitzer wie IS-A mit HAS-A verwechseln aber tunlichst vermeiden!

    Ich hab eigentlich grad das Composite Pattern auf der Zunge, aber ich denke, ohne die Anforderungen an das Programm zu kennen, bringen konstruktive Vorschläge nicht sehr viel.



  • Bashar schrieb:

    zwette schrieb:

    (es handelt sich ünbrigens um eine Belegarbeit für "Objektorientiertes Programmieren")

    Da sollte man solche Schnitzer wie IS-A mit HAS-A verwechseln aber tunlichst vermeiden!

    Ich hab eigentlich grad das Composite Pattern auf der Zunge, aber ich denke, ohne die Anforderungen an das Programm zu kennen, bringen konstruktive Vorschläge nicht sehr viel.

    Hast Recht, ich werde das Konzept einfach nochmal überdenken, trotzdem danke an Euch alle für die Hilfe, ich komme wieder auf euch zurück (wenn ich darf). 🙂

    zwette



  • Ist euch im wirklichen Leben selbst schonmal eine Diamantstruktur untergekommen? Mehrfachvererbung OK, gibt's gelegentlich, aber ich hatte noch nie mit Diamanten zu tun, außer bei hypothetischen Überlegungen.


Anmelden zum Antworten