pure virtual + static
-
Warum (oder doch?) kann man keine Funktion
virtual static void someFuntion(void) = 0;definieren?
-
myers schrieb:
Warum (oder doch?) kann man keine Funktion
virtual static void someFuntion(void) = 0;definieren?
nap schau in dein buch
-
-
krieg ich eine erklährung oder nicht?
-
Hausaufgaben machen wir hier nicht für dich!
-
Ich frage mich das gerade, weil ich es probiert habe. Nun geht es nicht, ich finde keine Erklährung, deswegen frage ich.
Ist daran was falsch?
-
Eine virtuelle static-Funktion macht doch gar keinen Sinn. Ließ doch mal nach was du mit virtuellen Funktionen machen kannst, du wirst feststellen, dass bei Durchführung dieser Aktionen ein Objekt vorhanden sein muss.
static heißt nun aber, dass eben kein Objekt vorhanden ist.
MfG SideWinder
-
Dass dabei kein Objekt vorhanden sein muss ist mirklar,nur warum muss für virtual ein Objekt vorhanden sein?
-
Zeig mir eine Anwendung von virtual wo du kein Objekt benötigst, bzw. weißt du überhaupt was virtual macht? http://tutorial.schornboeck.net/virtual.htm
MfG SideWinder
-
Ohne object machts keinen sinn zur Laufzeit festzustellen von welchem typ das nicht vorhandene objekt ist um abhängig vom typ des nicht vorhandenen objects zu entscheiden welche methode aufgerufen werden soll.
Ist das eine ausreichende Erklärung ?
Kurt
-
Ok, verstanden. Trotzdem muss man da doch nicht gleich so rumtönen wie die beiden unregistrierten da oben...
Vielen Dank!
-
Selbst wenn es Sinn machen würde, wie sollte es funktionieren?
struct foo { virtual static void whatever() = 0; }; struct bar : foo { virtual static void whatever() {} }; struct baz : foo { virtual static void whatever() = {} }; int main() { foo::whatever(); /* welche Methode wird denn jetzt aufgerufen? */ }
-
myers schrieb:
Trotzdem muss man da doch nicht gleich so rumtönen wie die beiden unregistrierten da oben...
Da muss ich ihm Recht geben. Man sollte Menschen nicht wegen seinem Wissen runtermachen.
Er hat ganz normal gefragt, also sollte er auch ne normale Antwort bekommen. Man hat ja gesehen das er es noch nicht die ganze Sache mit virtual verstanden hat ...

-
Ich hatte eben noch im Kopf, dass man mit pur virtuellen Funktionen(was ja meine Frage war) das Implementieren bei abgeleiteten Kalssen "erzwingen" kann.
Vorausgesetzt man will nich wieder eine abstrakte Klasse.
Das könnte ja auch bei einer statischen Funktion Sinn machen und eben das hatte ich eben probiert.
-
myers schrieb:
Ich hatte eben noch im Kopf, dass man mit pur virtuellen Funktionen(was ja meine Frage war) das Implementieren bei abgeleiteten Kalssen "erzwingen" kann.
Vorausgesetzt man will nich wieder eine abstrakte Klasse.
Das könnte ja auch bei einer statischen Funktion Sinn machen und eben das hatte ich eben probiert.Welchen Sinn sollte es machen, die Implementierung einer statischen Methode in einer Subklasse zu erzwingen, wenn man damit nicht auf die speziellen Member der abgeleiteten Klasse zugreifen kann?
-
@myers
Versuch Dir mal statische funktionen als globale funktionen vorzustellen, die auf Grund ihres Contextes nur in einer Klassendefinition versteckt sind

(eine globale Funktion, die von einer Klasse "abhaengig" ist / sich logisch auf eine Klasse bezieht, warum sollt man die nicht mit der Klasse definieren, auch wenn die funktion kein Object der Klasse brauch ? Genau das ist der sinn einer statischen memberfunktion ! )Nun Stell dir Frage noch mal :
dass man mit pur virtuellen Funktionen(was ja meine Frage war) das Implementieren bei abgeleiteten Kalssen "erzwingen" kann.
Die frage umformuliert:
Was macht es fuer einen Sinn, globale funktionen zu erzwingen (mittels einer Klassendefinition) ?Ciao ...
-
SideWinder schrieb:
Eine virtuelle static-Funktion macht doch gar keinen Sinn.
Das würde ich nicht unterschreiben. In C++ wurden solche Funktionen nicht berücksichtigt. Und aus technischer Sicht lässt sich gut erklären, warum sie nicht im C++ das wir kennen enthalten sind. Das heißt aber nicht, dass solche Funktionen keinen Sinn machen oder nicht implementierbar wären.
In dynamischeren Sprachen, in denen Klassen selbst auch Objekte sind, werden virtuell statische Funktionen wieder ganz natürlich. Und noch ein klassisches Beispiel wo virtuell statische Funktionen in C++ schön wären: Persistenzhaltung.
Hier braucht man in der Regel eine Abbildung zwischen Typ (Klasse) und Identifier (Name oder Integer-Id). Beim Speichern schreibt man object.getId(). Beim Laden braucht man Class::getId(). Gäbe es nun virtuell statische Funktionen, käme man mit einer getId-Methode aus. Diese wäre virtuell statisch und würde im Schreibfall virtuell (Aufruf über Objekt) und im Lesefall statisch aufgerufen werden. Markiert man die Methode noch als pure in der Basisklasse hat man gleich noch eine schöne Dokumentation.In C++ muss man hier nun aber Duplikation + Forwarding verwenden. Sprich: zwei Methoden (getId, getClassId) wobei die nicht-statische die statische aufruft.
PS:
Genaugenommen gibt es in Standard-C++ sogar eine Ausnahme, die sich genau wie eine virtuelle statische Funktion verhält. Nämlich operator delete. Diese Funktion ist per Definition statisch, verhält sich aber virtuell (d.h. ruft den passenden Destruktor auf (natürlich nur wenn er in der Basisklasse virtuell ist)).
-
In dynamischeren Sprachen, in denen Klassen selbst auch Objekte sind, werden virtuell statische Funktionen wieder ganz natürlich.
Dann ist aber ebenfalls wieder ein Objekt vorhanden

<some more use cases>
Hast ja recht

MfG SideWinder