Subclass Methode aufrufen
-
Hi,
noch eine einfache Frage hinterh, wo ich grad hänge: Ich hab eine Klasse, die zwei Subklassen hat.
class MyClass { virtual void GetValue(CString & name, CString & value); }; class Subclass1 : public MyClass { virtual void GetValue(CString & name, CString & value) { name = m_name1; value = m_value1; } private: CString m_name1; CString m_value1; }; class Subclass2 : public MyClass { virtual void GetValue(CString & name, CString & value) { name = m_name2; value = m_value2; } private: CString m_name2; CString m_value2; }; void MyTestClass::Init(void) { MyClass myVar; CString name1; CString value1; myVar.GetValue(name1, value1); }Wie kann ich der Variable myVar sagen, dass sie entweder die Subclass1 oder die Subclass2 aufrufen soll wenn ich die Methode GetValue aufrufe?
Mfg
Kurzer
-
Dazu müsstest du myVar auch als Subclass1 oder Subclass2 deklarieren, nicht als MyClass.
-
Kurzer schrieb:
Wie kann ich der Variable myVar sagen, dass sie entweder die Subclass1 oder die Subclass2 aufrufen soll wenn ich die Methode GetValue aufrufe?
MyClass hat nur Typinformationen übersich selbst. Woher sollte sie eine Subklasse kennen. Das wäre ja so, wie wenn du dein nicht existierendes Kind kennst.
-
Danke für die Antworten.
Dann leuchtet mir grad noch nicht der Sinn von einer Subklasse ein:
void MyTestClass::Init(void) { Subclass1 myVar1; Subclass2 myVar2; CString name1; CString value1; myVar1.GetValue(name1, value1); }weil im Prinzip sieht es bis jetzt für mich so aus, dass ich die Funktion GetValue() auch ohne MyClass im gleichen Stile aufrufen kann.
-
Also, erst einmal 2 wichtige Grundregeln fürs ableiten:
Du darfst nur dann ableiten,
- wenn es eine "is-a" Beziehung ist und
- wenn das LSP-Prinzip (Liskovsches Substitutionsprinzip) zutrifft.Nur wenn diese 2 Regelen erfüllt werden, macht eine Ableitung Sinn und nur dann solltest du auch ableiten.
is-a Beziehung: Lebewesen <-- Mensch <-- Student
Ein Student ist ein (is-a) Mensch und ein Mensch ist wiederum ein Lebewesen.
--> Umso weiter man ableitet, um so detaillierter wird es, wie du sehen kannst.
--> Du leitest also ab, wenn du etwas detaillierter haben möchtest (Student), jedoch die Grundlagen nicht neu definieren willst, da diese ja bereits bekannt sind (Lebewesen bzw. Mensch).LSP Prinzip kannst du hier mal nachlesen:
http://de.wikipedia.org/wiki/Liskovsches_Substitutionsprinzip
Zum Beispiel sollst du "Kreis" nicht von "Ellipse" ableiten, obwohl is-a zutrifft.
--> Ein Spezialfall soll also keine Ableitung darstellen.
-
Dweb schrieb:
Also, erst einmal 2 wichtige Grundregeln fürs ableiten:
Du darfst nur dann ableiten,
- wenn es eine "is-a" Beziehung ist und
- wenn das LSP-Prinzip (Liskovsches Substitutionsprinzip) zutrifft.Nur wenn diese 2 Regelen erfüllt werden, macht eine Ableitung Sinn und nur dann solltest du auch ableiten.
Du beziehst dich auf öffentliche Vererbung, oder? Für private Vererbung ist das überhaupt nicht so. Und von dürfen würde ich auch nicht reden, sondern eher von sollen.
-
drakon schrieb:
Du beziehst dich auf öffentliche Vererbung, oder? Für private Vererbung ist das überhaupt nicht so.
Wie sind den die Regeln für eine private Vererbung ?
-
Oft wird das als "has-a" beschrieben. Die Klasse benutzt bei der private Vererbung die Basisklasse und nutzt sie, um die eigene Funktionalität zu implementieren. Es ist eine Art Aggregation.
-
Es ist ja quasi das gleiche wie Einbettung, denn die abgeleitete Klasse nutzt die Funktionen der Basis um sich selbst zu implementieren. So ist es ja eigentlich auch bei der Einbettung, wenn eine Klasse eine andere enthält, dann nutzt sie ja auch die Funktionen um sich selbst zu implementieren. Die Schnittstelle, der eingebetteten Klasse oder eben der privaten Basisklasse, ist in der Schnittstelle der abgeleiteten bzw der Klasse die die andere einbettet nicht enthalten.
Lg freeG
-
Genau. Ich persönlich habe private Vererbung noch nie wirklich gebraucht. Ich bevorzuge üblicherweise aus dem Objekt gleich ein ganz normale Member zu machen.
-
Dito

Lg freeG