JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=f8e7ddceb2392c078733d0d500a8f0eeMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Unterklassen Methoden

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Pizzabroetchen
Junior JLI'ler



Anmeldedatum: 29.02.2004
Beiträge: 55

Medaillen: Keine

BeitragVerfasst am: 21.06.2006, 12:19    Titel: Unterklassen Methoden Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 21.06.2006, 12:37    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Pizzabroetchen
Junior JLI'ler



Anmeldedatum: 29.02.2004
Beiträge: 55

Medaillen: Keine

BeitragVerfasst am: 21.06.2006, 12:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 21.06.2006, 13:10    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Pizzabroetchen
Junior JLI'ler



Anmeldedatum: 29.02.2004
Beiträge: 55

Medaillen: Keine

BeitragVerfasst am: 21.06.2006, 13:27    Titel: Antworten mit Zitat

Danke Greven klappt nu alles wieder so wie ich es wollte!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum