abstrakte Funktion mit unbekanntem return-Type

MetallDragon

Erfahrenes Mitglied
Hi Leute,
Eine kleine Frage: Kann ich abstrakte Funktionen mit einem unbekannten Rückgabetyp deklarieren ?

Die Sache ist die Folgende:
Ich habe meine abstrakte Basisklasse B und meine abgeleiteten Klassen D1, D2 und D3.
D1, D2 und D3 erben alle von B die Funktion Get().
Jetzt soll aber jede der abgeleiteten Klasse einen anderen Rückgabetyp haben...
also z.B
int D1::Get();
float D2::Get();
string D3::Get();

wie muss jetzt der Prototy in Base aussehen ?
-was kommt hier- B::Get();

So, ich hoffe, dass ich mich einigermaßen verständlich ausgedrückt habe...
Danke für die Mühen, sich den Beitrag bis hier hin durchzulesen.

M.D
 
Nein, das geht nicht.
Überdenk es mal: wie würde denn ein Benutzer einer dieser Klassen dann unterscheiden können, was für einen Typ er zurückgeliefert bekäme?
 
moin


Kriegen die Funktionen noch was anders mit übergeben?
Und unterscheiden sie sich nur durch den Rückgabetyp?


mfg
umbrasaxum
 
Hy!

Ich weis nicht ganz ob du das so meinst, aber du könntest das doch über Templates machen:
Code:
template<class T>
T B::Get()
{
   return m_meinMember;
};
dann kannst du beim Anlegen der Klasse bestimmen welchen Typ die Funktion zurückgeben soll
Kurze Template Einführung

mfg
uhu01
 
Die Idee, mit den Templates hatte ich auch schon. Allerdings nur als Funktionstemplate.
Das ganze als Template-Klasse zu machen ist ne gute Idee. Ich werde das heute mal testen.


@Umbrasaxum:
Nein, sonst hätte ich sie ja schon überladen.
Aussderdem würden mir dann die ganzen abstrakten Funktionen in der Basisklasse im Weg sein, da die dann auch an die Klassen vererbt werden würden, die die Funktion gar nicht haben sollen.
Also bezogen auf das Beispiel:
D1 hätte auch Get()-Methoden für strings und floats...


Danke an Alle
 
Also die Idee mit den Templateklassen war gut. ICh musste zwar noch ziemlich dran rumfeilen, da der Sachverhalt in wirklichkeit ein ganzes Stück komplizierter ist aber jetzt geht es mehr oder weniger.

Aber da tut sich eine neue (wenn auch nicht allzu dringliche) Frage auf:
Und zwar:
Für dynamic_casts benötigt man ja in bestimmten fällen eine virtuelle Basisklasse.
Was mache ich aber, wenn diese Basisklasse entweder gar keine Funktionen bestitzt, die man als virtual definieren könnte ?
In meinem aktuellen Fall ist es zwar nicht weiter tragisch, da ich zwar keine Funktionen habe, die virtuell sein müssen und desshalb einfach irgendeine Kapselungsmethode als virtual gekennzeichnet habe.

Das sieht jetzt allerdings nicht besonders schön/professionell aus.
Und desshalb meine Frage: Gibt es auch irgendeine schönere Lösung, eine Klasse als virtual zu definieren ?

Ist mehr eine Stielfrage, die mich einfach mal interessiernt.
Danke für eure Mühen.
M.D
 
MetallDragon hat gesagt.:
Also die Idee mit den Templateklassen war gut. ICh musste zwar noch ziemlich dran rumfeilen, da der Sachverhalt in wirklichkeit ein ganzes Stück komplizierter ist aber jetzt geht es mehr oder weniger.

Aber da tut sich eine neue (wenn auch nicht allzu dringliche) Frage auf:
Und zwar:
Für dynamic_casts benötigt man ja in bestimmten fällen eine virtuelle Basisklasse.
Was mache ich aber, wenn diese Basisklasse entweder gar keine Funktionen bestitzt, die man als virtual definieren könnte ?
In meinem aktuellen Fall ist es zwar nicht weiter tragisch, da ich zwar keine Funktionen habe, die virtuell sein müssen und desshalb einfach irgendeine Kapselungsmethode als virtual gekennzeichnet habe.

Das sieht jetzt allerdings nicht besonders schön/professionell aus.
Und desshalb meine Frage: Gibt es auch irgendeine schönere Lösung, eine Klasse als virtual zu definieren ?

Ist mehr eine Stielfrage, die mich einfach mal interessiernt.
Danke für eure Mühen.
M.D

Templates sind aber nicht die Antwort auf deine eigentliche Frage. Wenn du eine Template-Klasse als Basisklasse hast, dann hast du nicht "eine" Klasse, von der du Klassen mit Funktionen mit verschiedenen Rückgabetypen ableitest, sondern du hast mehrere Basisklasssen (für jeden Typ) -> kannst also nicht zwischen den verschiedenen Typen Hin-Und-Her Casten...

Wofür braucht man eigentlich dynamic_cast..? Braucht man doch nur für Downcasts... und Downcasts sind sowieso keine schöne Variante, da könnte man gleich wieder switches einführen.... wozu gibts denn Virtuelle Funktionen? -> Das man einen Zeiger/Referenz auf eine Basisklasse benutzen kann, ohne zu wissen, welchen Typ sie genau hat!
 
Wie schon gesagt. Der tatsächliche Sachverhalt ist nicht ganz so einfach wie ich ihn hier dargestellt habe. Von daher habe ich das ganze dann über eine Templateklasse gedeichselt.
Ausserdem scheint es ja keine andere Lösung zu geben.
Ich kann die den Quellcode ja mal schicken wenn du willst. Vielleicht findest du ja ne bessere Alternative zu meiner Lösung...

Zum aktuellen Problem:
Ich will ja nicht in die Basisklasse casten sondern in die Abgeleitete.
Und das die Sache nicht so wirklich schön ist habe ich ja gesagt.
Naja zumindest Funktioniert's.

M.D
 
Zurück