Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Pizzabroetchen Junior JLI'ler
Anmeldedatum: 29.02.2004 Beiträge: 55
Medaillen: Keine
|
Verfasst am: 21.06.2006, 12:19 Titel: Unterklassen Methoden |
|
|
Hallo!
Ich habe folgendes Problem: Ich habe eine Basisklasse von der mehrere Unterklassen abgeleitet werden. Die Objekte (aus den Unterklassen) will ich nun in einer Liste vom Typ der Basisklasse speichern (damit ich alle unterklassenobjekte in einer Liste habe und zusammen verwalten kann).
Mein Problem: Wenn ich nun auf die Liste zugreife und eine Methode der Unterklasse aufrufen will, zieht er nur die der Basisklasse (habe die Methode der BAsisklasse in der Unterklasse überschrieben).
Hier nochwas Code
CPP: | class Textbox : public XObjekt
{
void DrawBox(void);
}
class Messagebox : public Textbox
{
void DrawBox(void);
}
Messagebox box;
m_boxes.push_back(box);
for (it=m_boxes.begin(); it!= m_boxes.end(); it++)
{
Textbox temp = *it;
(*it).DrawBox();
temp.m_vPosition.y +20);
}
|
|
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 21.06.2006, 12:37 Titel: |
|
|
Da fehlt das 'virtual', wenn du sie überschreiben möchtest. Ansonsten kannst du, wenn Basisklasse und abgeleitete Klasse zwei namensgleiche Methoden haben mittels 'basisklasse_name::methode' explizit auf die Methode der Basisklasse zugreifen, z.B. in Methoden der abgeleiteten Klasse. Was in solchen Konstrukten wie von dir beschrieben auch manchmal Ärger macht ist die implizite Typumwandlung, wenn du einem Zeiger vom Typ "Basisklasse" die Adresse eines Objektes vom Typ "abgeleitete Klasse" zuweist, kannst du über den Zeiger nur noch auf die Methoden zugreifen, die in der Basisklasse enthalten sind, Abhilfe schafft an dieser Stelle ein Cast zum Typ der abgeleiteten Klasse, aber das nur nebenbei. |
|
Nach oben |
|
|
Pizzabroetchen Junior JLI'ler
Anmeldedatum: 29.02.2004 Beiträge: 55
Medaillen: Keine
|
Verfasst am: 21.06.2006, 12:57 Titel: |
|
|
danke schonmal für die schnelle antwort.
Ich möchte ja nur auf Methoden zurückgreifen, die auch in der Basisklasse vorkommen, aber es sollen halt die überschriebenen der Unterklasse sein.
Wenn ich die Objekte sowie in meinem Codebeispiel erzeuge, "schneidet" der dann die Methoden und Variablen der abgeleiteten Klasse ab?
Also auch mit vritual nimmt er die Methode der Basisfunktion..
Habe zu dem Thema etwas über Basisklassenzeiger gelesen, vielleicht ist das der richtige Ansatz |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 21.06.2006, 13:10 Titel: |
|
|
Pizzabroetchen hat Folgendes geschrieben: | Ich möchte ja nur auf Methoden zurückgreifen, die auch in der Basisklasse vorkommen, aber es sollen halt die überschriebenen der Unterklasse sein.
Wenn ich die Objekte sowie in meinem Codebeispiel erzeuge, "schneidet" der dann die Methoden und Variablen der abgeleiteten Klasse ab? |
Nope, dann werden die Methoden der Basisklasse durch die Methoden der abgeleiteten Klasse überschrieben. ;)
CPP: | #include <iostream>
...
class base
{
public:
virtual void write(void) { std::cout << "base" << std::endl; }
};
class derived : public base
{
public:
void write(void) { std::cout << "derived" << std::endl; }
void foobar(void) {}
};
...
base obj1;
derived obj2;
obj1.write(); // wird "base" anzeigen
obj2.write(); // wird "derived" anzeigen
base* ptr = &obj2;
ptr->write(); // wird "derived" anzeigen
ptr->foobar(); // wird krachen, weil "foobar" nicht in base bekannt |
Edit: Btw: 'virtual' wird nicht als Schlüsselwort erkannt. |
|
Nach oben |
|
|
Pizzabroetchen Junior JLI'ler
Anmeldedatum: 29.02.2004 Beiträge: 55
Medaillen: Keine
|
Verfasst am: 21.06.2006, 13:27 Titel: |
|
|
Danke Greven klappt nu alles wieder so wie ich es wollte! |
|
Nach oben |
|
|
|