Frage Vererbung??
-
Folgende Konstellation:
class Basis{ protected: class Data{ int m_DataA; }; Data* pData; }; class Ableit1 : public Basis{ class Data1 : public Basis::Data{ int m_Data1; }; }; class Ableit2 : public Basis{ class Data2 : public Basis::Data{ int m_Data2; }; }; class Kombination : public Ableit1, Ableit2{ }Folgednes Problem: Wenn ich nun ein Objekt von Basis erzeuge, hab ich ein Objekt Data mit member m_DataA;
wenn ich nun ein Objekt der Klasse Kombination erzeuge , will ich das bspw. das pData Objekt der Basis durch die daten der Ableit1, und Ableit2 Daten klasse m_Data1 und m_Data2 erweitert wird....Versteht ich was ich meine ? Grüße
-
Du hast hier zwei verschiedene Hierarchien miteinander vermischt - einmal die von Basis und die von Basis::Data:
B B B:: D | | / \ v v v v A1 A2 A1:: D1 A2:: D2 \ / V KombDa du keine virtuelle Vererbung verwendet hast, hat Kombination jetzt zwei Basis-Anteile, die du über 'Ableit1::pData' bzw. 'Ableit2::pData' ansprechen kannst. Und jedes dieser pData-Elemente kann wahlweise auf ein Basis::Data-Objekt (oder ein Kind davon) zeigen.
PS: Übrigens solltest du zumindest der Data-Klasse einen virtuellen Destruktor verpassen.
Edit: Verd***, was sollen die Smilies in dem Diagramm?
-
Wenn ich nun in Kombination auf pData zugriefen will, so das pData
m_DataA ,m_Data1 und m_Data2 daten hat.. wie muss ich dann vererben? reciht es wenn ich bei jeder Data1 und Data2 klasse mit "virtuel" ableite?
-
Wie gesagt, du hast zwei pData's, die auch auf unterschiedliche Objekte zeigen können. Wenn dir das zu viel ist, kannst du jeweils virtuell von Basis bzw. Basis::Data ableiten (und eine Klasse Kombination::Data dazupacken, die von den beiden Zwischenklassen Ableit1::Data1 und Ableit2::Data2 abgeleitet ist).
Aber was spricht eigentlich dagegen, die m_DataA etc direkt in deine Klassen zu integrieren? Mit dem Design mußt du dich nur ständig mit Downcast's rumschlagen, um an die Elemente der abgeleiteten Klassen zu kommen (pData ist und bleibt ein Zeiger auf Basis::Data - wenn du der Meinung bist, daß sich dahinter etwas anderes verbirgt, mußt du das dem Compiler klar machen).
PS: Dir ist hoffentlich klar, daß Kombination privat von Ableit2 abgeleitet ist.