Abstrakte virtuelle Funktionen überladen ?

MetallDragon

Erfahrenes Mitglied
Servus Leute,
Ich denke der Titel sagt schon alles aber hier nochmal zum mitschreiben:
Kann ich eine abstrakte Funktion einer Klasse á la
virtual void MeineFunktion(int a, int b) = 0;
überladen ?

Mein Compiler meckert da nämlich rum, wenn ich Objekte des Types, zudem die Funktion gehört, alloziiren will.
Eine Deklaration wie:
virtual void MeineFunktion(int a, int b){};
macht keine Probleme.

Es ist zwar in diesem Fall nicht zwingend, dass die Klasse abstrakt ist es würde mich nur einfach mal interessieren.

Danke für eure Hilfe.
 
Also ich habe das schon paar mal gemacht geht eigentlich schon, sag mal was der Compiler sagt oder Besipielcode
 
moin


Mein Buch sagt folgendes:
"Jede Klasse mit einer oder mehreren abstrakten Funktionen ist ein abstrakter Datentyp. Es ist verboten, ein Objekt einer als ADT fungierten Klasse zu instantiieren. Der Versuch führt bereits zu einem Compiler-Fehler. Bringt man eine abstrankte Funktion in einer Klasse unter, signalisiert man den Klienten der Klasse zwei Dinge:
- Erzeuge kein Objekt dieser Klasse, sondern leite von dieser Klasse ab.
- Überschreibe auf jedenfall die abstrakte Funktion.

Von einer ADT abgeleiteten Klasse erben die abstrankten Funktionen in ihrer "reinen" Form. Aus diesem Grund muss man die geerbten abstrakten Funktionen überschreiben, wenn man Objekte der abgeleiteten Klasse instantiieren möchte"


mfg
umbrasaxum
 
@umbrasaxum: Mein Fehler. Es geht natürlich um die Alloziirung von Objekten einer Klasse, die von der abstrakten Klasse abgeleitet ist.

Ich habe inzwischen auch schon eine Idee, warum es da Fehler gibt.
Ist es so, dass jede abstrakte Funktion in der abgeleiteten Klass neu definiert werden muss ?
Wenn ja hätte ich zumindest schon mal den Grund, warum es nicht geht.
Die Sache ist nämlich die:
Ich hab eine Basisklasse:
CSpell
mit zwi abstrakten Memberfunktionen.
effect(unsigned int, CCharacter *victim)=0;
effect(string, unsigned int, CCharacter *victim)=0;

von dieser Basisklasse werden nun verschiedene Klassen abgeleitet wie z.B
CSpellBlizzard in denen aber jeweils nur eine der abstrakten Funktionen überschrieben wird.

Im Nachhinein eigendlich ganz logisch, dass es da nicht geht.

Hintergrund ist der, dass ich für eine RPG-Lib, an der ich z.Z arbeite, Zaubersprüche integrieren will.
Das mache ich, wie man schon am Beispielcode erkennen konnte, indem ich von einer Basisklasse jeweils Unterklassen ableite, die dann den jeweiligen Effekt in die effect-Funktion schreiben.
Von diesen Klassen werden dann noch Objekte erzeugt und fertig ist der Zauberspruch ;)

Ich denke, dass ich es dann evtl so löse, dass ich noch ne Klasse "dazwischenschalte".
Also statt der derzeitigen Ableitungsherachie:
CSpell -> z.B CSpellBlizzard
eine andere á la
CSpell -> CSpellX -> CSpellBlizzard

Naja aber da nur am Rande. Wenn jemand ne ganz geniale Idee hat, wie man die Zaubersprüche anderweitig realisieren kann - immer her damit !

Danke trotzdem für eure Hilfe.
 
Zuletzt bearbeitet:
Zurück