kurze ketzerische Frage: Warum muss / soll man überhaubt eine virtuelle methode deklarieren, die man gezwungener Weise sowieso in jeder Klasse overriden muss? Wenn man sowieso in jeder Klasse eine eigene implementierung einer Funktion hat , kann man dann nicht sagen man braucht keine basis funktion von der geerbt wird?Wozu etwas vererben wenn man es komplett neu in der geerbten Klasse bauen muss?
Für die Polymorphie brauchst du das. Stell dir vor du hast verschiedene Objekte in einem Spiel. Jedes Objekt erbt von einer Klasse GameObject, die eine pure virtual render Methode vorschreibt. Jedes Objekt kann demnach entscheiden, wie genau es gerendert werden muss. Das Spiel wiederum hat einfach eine Liste an GameObjects und kann diese durchgehen und render aufrufen.
Danke für das tolle Video. Kann man die dynamischen Objekte auch in irgend eine Collection schieben? List, Vector etc? Weil wenn ich das tue läuft der Polymorphismus nicht mehr. Es wir dann immer die Methode der Basisklasse ausgeführt. Wenn man es so macht wie du dann kann man durch das statische Array iterieren und es klappt. Danke 🤘
@@Pilzschaf So jetzt hab ich das nochmals getestet mit list, vector und es geht tatsächlich nicht! Es wird immer die Basis Methode ausgeführt. Damit ist der Polymorphismus ausgeschaltet, was damit den eigentlichen Sinn total aushebelt. Ok mit statischen Arrays wie du es auch gezeigt hast geht es aber man hat damit den Service der neuen Collections nicht. Gut man könnte eine eigene verkettete Liste erstellen dann geht es zu 100% was man dann auch machen müsste. Schade wirklich! Danke nochmals für deine Rückmeldung und dein Video.
Zo, habs raus gefunden man muss genau das tun, damit es klappt vector fahrzeuge; und nicht so !!!vector fahrzeuge!!! Danach mit fahrzeuge.pushback( new mercedes()); danach kann man dann mit fahrzeuge.front()->toString(); aufrufen die toString() Methode muss dann virtual sein bzw. gleich terminiert mit 0 dann ist die Klasse abstrakt und ich kann wie beschrieben das so ausführen und der Polymorphismus greift dann perfekt. Danke für den Kick. Hat mich zwar Zeit gekostet aber dafür vergisst man es nie wieder. Und jetzt hat man allen Service den die Collection mit sich bringt. Perfekt.
Gibt es eine vordefinierte Methode/Schlüsselwort, um den Typ eines Objektes zu testen, wie sizeof für die Größe eines Objektes? Also wenn ich z.B. in dem Beispiel alle Busse aus dem Vehicle-Array löschen möchte, bräuchte ich ja etwa soetwas: if (typeof(vehicles[i]) == Bus) { delete vehicles[i]; vehicles[i] == nullptr; } Gibt es soetwas wie typeof oder muss man das wie in dem Beispiel mit getType selbst implementieren? Und wenn man es selber machen muss: Gibt es eine emfohlene Art, um dies zu tun? (wie eine member Variable oder eine Methode, die einen String zurück gibt?)
Tatsächlich gibt es das nicht so ohne Weiteres. Es gibt die Runtime Type Information (RTTI) mit dem Schlüsselwort kannst du dich ein bisschen auf die Suche begeben. Aber oft würde man tatsächlich eine getType virtuelle Methode erstellen, die dann z.B. einen String oder am besten ein Enum zurück gibt.
Danke!
Hat mir sehr geholfen! :)
kurze ketzerische Frage: Warum muss / soll man überhaubt eine virtuelle methode deklarieren, die man gezwungener Weise sowieso in jeder Klasse overriden muss? Wenn man sowieso in jeder Klasse eine eigene implementierung einer Funktion hat , kann man dann nicht sagen man braucht keine basis funktion von der geerbt wird?Wozu etwas vererben wenn man es komplett neu in der geerbten Klasse bauen muss?
Für die Polymorphie brauchst du das. Stell dir vor du hast verschiedene Objekte in einem Spiel. Jedes Objekt erbt von einer Klasse GameObject, die eine pure virtual render Methode vorschreibt. Jedes Objekt kann demnach entscheiden, wie genau es gerendert werden muss. Das Spiel wiederum hat einfach eine Liste an GameObjects und kann diese durchgehen und render aufrufen.
Danke für das tolle Video. Kann man die dynamischen Objekte auch in irgend eine Collection schieben? List, Vector etc? Weil wenn ich das tue läuft der Polymorphismus nicht mehr. Es wir dann immer die Methode der Basisklasse ausgeführt. Wenn man es so macht wie du dann kann man durch das statische Array iterieren und es klappt. Danke 🤘
Ja, das geht indem du die Pointer (oder Referenzen) der Objekte in der Collection abspeicherst. Polymorphie sollte dann ganz normal funktionieren
@@Pilzschaf So jetzt hab ich das nochmals getestet mit list, vector und es geht tatsächlich nicht! Es wird immer die Basis Methode ausgeführt. Damit ist der Polymorphismus ausgeschaltet, was damit den eigentlichen Sinn total aushebelt. Ok mit statischen Arrays wie du es auch gezeigt hast geht es aber man hat damit den Service der neuen Collections nicht. Gut man könnte eine eigene verkettete Liste erstellen dann geht es zu 100% was man dann auch machen müsste. Schade wirklich! Danke nochmals für deine Rückmeldung und dein Video.
Also wie gesagt: Eigentlich sollte es funktionieren. Wenn du willst kannst du mir mal den Code über Discord senden
Zo, habs raus gefunden man muss genau das tun, damit es klappt vector fahrzeuge; und nicht so !!!vector fahrzeuge!!! Danach mit fahrzeuge.pushback( new mercedes()); danach kann man dann mit fahrzeuge.front()->toString(); aufrufen die toString() Methode muss dann virtual sein bzw. gleich terminiert mit 0 dann ist die Klasse abstrakt und ich kann wie beschrieben das so ausführen und der Polymorphismus greift dann perfekt. Danke für den Kick. Hat mich zwar Zeit gekostet aber dafür vergisst man es nie wieder. Und jetzt hat man allen Service den die Collection mit sich bringt. Perfekt.
Gibt es eine vordefinierte Methode/Schlüsselwort, um den Typ eines Objektes zu testen, wie sizeof für die Größe eines Objektes?
Also wenn ich z.B. in dem Beispiel alle Busse aus dem Vehicle-Array löschen möchte, bräuchte ich ja etwa soetwas:
if (typeof(vehicles[i]) == Bus) {
delete vehicles[i];
vehicles[i] == nullptr;
}
Gibt es soetwas wie typeof oder muss man das wie in dem Beispiel mit getType selbst implementieren?
Und wenn man es selber machen muss: Gibt es eine emfohlene Art, um dies zu tun? (wie eine member Variable oder eine Methode, die einen String zurück gibt?)
Tatsächlich gibt es das nicht so ohne Weiteres. Es gibt die Runtime Type Information (RTTI) mit dem Schlüsselwort kannst du dich ein bisschen auf die Suche begeben. Aber oft würde man tatsächlich eine getType virtuelle Methode erstellen, die dann z.B. einen String oder am besten ein Enum zurück gibt.
@@Pilzschaf Vielen Dank für die schnelle Antwort. An ein Enum hab ich gar nicht gedacht, aber das ist natürlich deutlich besser als ein String.
Ehrenmann !!!
Danke für die mühen aber unübersichtlich erklärt
Nein.
Ich bin gay falls es jemand juckt