Vererbung und überschreiben von Methoden

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
teh_teddy
Beiträge: 3
Registriert: 3. Januar 2013 00:33

Vererbung und überschreiben von Methoden

Beitrag von teh_teddy »

Hallo zusammen!
Folgendes Problem:
Ich habe eine Klasse "Spieler" und z.B. die Klassen "LokalerSpieler", "Netzwerkspieler" und "AiSpieler", welche alle von der Klasse "Spieler" abgeleitet sind. Also folgender Code:

Code: Alles auswählen

class Spieler {
public:
	Spieler();
	void nextRound();
	
protected:
	int runde;
	
};

class LokalerSpieler : public Spieler {
public:
	Player();
};

class Netzwerkspieler : public Spieler {
public:
	Netzwerkspieler();
	void nextRound();
};

class AiSpieler : public Spieler {
public:
	AiSpieler();
};
Die Klasse "Netzwerkspieler" soll beim Aufruf der Methode "nextRound()" etwas anderes tun, als die anderen beiden, weshalb ich die Methode hier überschrieben habe.
Führe ich nun folgenden Code aus, funktioniert das auch wunderbar:

Code: Alles auswählen

LokalerSpieler *lokal = new LokalerSpieler;
Netzwerkspieler *nw = new Netzwerkspieler;
AiSpieler *ai = new AiSpieler;

lokal->nextRound();
nw->nextRound();
ai->nextRound();
Da es aber nicht notwendigerweise nur 3 Spieler sind, will ich es mir etwas einfacher machen und die Objekte in einem QList-Element speichern:

Code: Alles auswählen

LokalerSpieler *lokal = new LokalerSpieler;
Netzwerkspieler *nw = new Netzwerkspieler;
AiSpieler *ai = new AiSpieler;

QList<Spieler*> spielerliste;
spielerliste.append(lokal);
spielerliste.append(nw);
spielerliste.append(ai);

foreach(Spieler *spieler, spielerliste) {
	spieler->nextRound();
}
Das Problem hierbei ist aber, dass beim Netzwerkspieler-Objekt die Methode der Spieler-Klasse ausgeführt wird, vermutlich weil es eben auch über einen Pointer der Klasse "Spieler" angesteuert wird.
Gibt es hier eine Möglichkeit dennoch die Methode der jeweiligen Kindklasse auszuführen?

Danke schonmal für Eure Hilfe!

Gruß,
Ted
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Vererbung und überschreiben von Methoden

Beitrag von veeman »

Hallo Ted,

du musst die Funktion als virtuell (virtual) deklarieren, dann geht das.

Mfg veeman
teh_teddy
Beiträge: 3
Registriert: 3. Januar 2013 00:33

Re: Vererbung und überschreiben von Methoden

Beitrag von teh_teddy »

Hallo Veeman,

danke schonmal für die Antwort!
Du meinst in der Mutterklasse, richtig? Habe ich dann aber nicht das Problem, dass die Methode zwingend in allen Kindklassen neu implementiert werden muss? Ginge natürlich schon, allerdings soll in den anderen beiden Kindklassen ja weiterhin die Methode der Mutterklasse ausführen.
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Vererbung und überschreiben von Methoden

Beitrag von veeman »

Ja genau in der Mutterklasse.

Nein du musst es nicht zwingend implementieren, wenn du es nicht implementierst dann wird nur die Funktion der Mutterklasse ausgeführt.

Wenn du einfach noch weitere Sachen zur ursprünglichen Funktion ausführen möchtest dann hast du die Möglichkeit in der Abgeleiteten Klasse explizit die Funktion der Elternklasse aufzurufen.

Code: Alles auswählen

class Spieler {
public:
   virtual void nextRound();
};

class LokalerSpieler : public Spieler {{
 // ein aufruf von nextRound führt die Funktion von der Mutterklasse Spieler auf
};

class Netzwerkspieler : public Spieler {
public:
   void nextRound()
   {
       Spieler::nextRound(); // optional, aufruf der Funktion der Mutterklasse
       // mach noch etwas
   };
};
Mfg veeman
teh_teddy
Beiträge: 3
Registriert: 3. Januar 2013 00:33

Re: Vererbung und überschreiben von Methoden

Beitrag von teh_teddy »

Ah super, das ist genau das, was ich gesucht habe!
Danke dir vielmals!
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Vererbung und überschreiben von Methoden

Beitrag von RHBaum »

Designregeln sind eigentlich recht easy:

- nicht virtuelle Methode:
muss implementiert werden
sollte von nachfolgenden Klassen nicht ueberschrieben werden (der Typ der referenz / zeiger bestimmt dann was aufgerufen wird, konfusion -> schlecht wartbarer Code)

- virtuelle Methode mit Implementation:
Implementation an der Ursprungsklasse ist die Default Implementation ... kann ueberschrieben werden.
Wird eigentlich immer als der Standardfall gelehrt. In der Praxis hat es durchaus seine Berechtigung, es sollten aber die abstrakten Versionen überwiegen (Interface basiertes Design).

- virtualle Methode ohne implementation (abstract)
Damit zwingst du die Ableiter, die Methode selbst zu implementieren in ihren zu instanziierenden Klassen.

Auch schlechtes Design ist, Methoden mit gleichen Namen aber unterschiedlichen Parametern (unterschiedliche symbole) in unterschiedlichen aber abgeleiteten klassen zu verwenden.
Das Methoden Lookup verhaelt sich dann unerwartet fuer die nutzer -> schlecht wartbarer Code.

Ciao ....
Antworten