Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

09.07.2011, 15:27

Kleine Frage wegen Polymorphie

Halli hallo.

Ich habe ine kurze Frage ;)
Ich habe zu Testzwecken mal eine Kleine Klassen Vererbung geschrieben.
Und jetzt wollte ich die Vererbung auf einen Pointer der Basisklasse legen (was man Polymorphie nennt, wenn ich mich nicht irre?).

Jetzt wollte ich wissen, ob ich wirklich alle Funktionen, die ich verwende, in der Basisklasse deklarieren muss, oder ob es auch eine andere Möglichkeit gibt?

Hier mal ein Beispiel, dass man besser sieht, was ich meine ^^

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    class Cbase //Basisklasse
    {
        public:
            Cbase() { cout << "CTor Basisklasse\n"; }
            virtual ~Cbase() { cout << "DTor Basisklasse\n"; }
            virtual void Funktion() {}
    };

    class Cver : public Cbase //Klasse mit Vererbung
    {
        public:
            Cver() { cout << "CTor Vererbung\n"; }
            ~Cver() { cout << "DTor Vererbung\n"; }

            void Funktion() { cout << "Funktion\n"; } //Funktion, die auferufen werden soll
    };

    Cbase * ver;
    ver = new Cver;

    ver -> Funktion();

    delete ver;


muss ich "virtual void Funktion() {}" zwingend definieren oder gibt es eine andere möglichkeit, um auf die member der Vererbten Klasse zuzugreifen ( ver -> Funktion(); )?

Mit freundlichen Grüßen,
Ombalat
»Ombalat« hat folgende Datei angehängt:
  • Turmstruktur.pdf (413,68 kB - 114 mal heruntergeladen - zuletzt: 06.05.2024, 08:36)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Ombalat« (11.07.2011, 17:58)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

09.07.2011, 15:44

Ich glaub Du gehst da etwas von der falschen Seite heran.
Der Zweck von Vererbung ist es nicht viele verschiedene Klassen unter einer Basis zusammenzufassen, damit man Polymorphie nutzen kann.

Der Sinn von Vererbung ist, dass es spezielle Untertypen von einer Basis-Klasse geben kann, die in ihrem Umfang der vorhandenen Methoden identisch sind, aber diese leicht anders durchführen, also spezieller sind als die Basis-Klasse.

Ein Auto kann immer fahren, anhalten und lenken. Aber ein Diesel fährt eben anders als ein Benziner und ein Automatik anders als ein Schaltwagen. Also wäre "Auto" die Basis-Klasse. Diesel, Benziner, Automatik und Schaltwagen wären Untertypen. Die allen gemeinsame Funktion wäre fahren, bremsen und lenken. Fahren wäre aber bei allen etwas anders und daher virtuell. Polymorphie wäre jetzt, dass Du alle diese Instanzen unter der Basis-Klasse "Auto" ansprechen kannst und Dich die eventuell zusätzlichen speziellen Methoden der Unterklassen gar nicht interessieren. So rum wird dann auch ein Schuh draus, aber nicht rückwärts.

Sollte es trotzdem mal notwendig sein eine spezielle Funktion einer Unterklasse aufzurufen (etwa "tauscheZündkerzen()" welche nur ein Benziner kennt - allerdings riecht das etwas nach schlechtem Design), dann kannst Du immer noch einen Cast durchführen und diese Methode muss natürlich NICHT in der Basis-Klasse existieren. Allerdings dürfte das ohne Typ-Prüfung dann natürlich eine Exception geben, wenn Du einen Automatik in einen Diesel casten willst oder bei nicht vorhandener Laufzeit-Typ-Information schlicht zu einem Zugriffsfehler bei der Verwendung dieser falsch gecasteten Variable.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »BlueCobold« (09.07.2011, 15:53)


3

09.07.2011, 15:48

Also wenn du die Funktion nicht in der Basisklasse brauchst, reicht es aus sie in der kindklasse zu implementieren.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

09.07.2011, 15:50

Koschi, dann kann er sie aber auch nicht polymorph aufrufen. ;) Also wäre da die Idee der Polymorphie total fehl am Platz.

Ich stell jetzt einfach mal die Frage:
Wozu genau willst Du die Polymorphie nutzen und wieso willst Du eine Funktion der Unterklasse aufrufen ohne dass diese in der Basis-Klasse existiert?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

09.07.2011, 16:12

Ich könnte mir vorstellen dass er einfach nur sowas wie eine abstrakte Klasse will. Schau dir mal an was eine rein virtuelle Funktion (pure virtual Function) ist.

6

09.07.2011, 18:28

Koschi, dann kann er sie aber auch nicht polymorph aufrufen. ;) Also wäre da die Idee der Polymorphie total fehl am Platz.

Stimmt hast natürlich recht.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

7

09.07.2011, 19:03

Danke schon mal für die vielen Antworten :)

Koschi, dann kann er sie aber auch nicht polymorph aufrufen. ;) Also wäre da die Idee der Polymorphie total fehl am Platz.

Ich stell jetzt einfach mal die Frage:
Wozu genau willst Du die Polymorphie nutzen und wieso willst Du eine Funktion der Unterklasse aufrufen ohne dass diese in der Basis-Klasse existiert?


Also, ich bin zur zeit dran, ein tower deffence zu programmieren ^^ und jetzt wollte ich mir mal gedanken machen, wie ich die türme da rein bring ;)
Dazu wollte ich eine gemeinsame Basisklasse "Turm" machen, wovon ich meine einzelnen Türme dann ableite.
Weil alle Türme können ja Schießen, haben eine Position auf der Karte, haben ein Ziel, auf was sie schießen etc.

Warum ich es mit einem Pointer überlege:
Wenn ich die Türme dann ins Programm lade, würde ich das über einen vector oder eine list machen.
Damit ich aber nicht für jede Turmart eine eigene Liste/vector anlegen muss, wollte ich sie eben so designen, dass ich sie dann alle in einer liste/vector habe.

Es ist gut möglich, dass ich da von einer ganz falschen seite aus drangehen :S

Edit: Der vorherige code war lediglich zu übungszwecken, wie sowas aussehen könnte ^^
Die Variable ver hätte ich dann in einen vector<Cbase> geschrieben

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

09.07.2011, 19:12

Nö, also die Idee stimmt so weit. Alles, was gemeinsam verwendet wird (ein Turm eben) kommt in die Basis-Klasse und diese ist dann der Typ der Listen-Elemente. Nur is mir da unklar wieso Du auf die Funktionen der Unterklassen zugreifen willst ohne diese in der Basis-Klasse zu definieren. Falls es nur darum geht, dass in der Basis-Klasse für die Funktion kein Code drin stehen soll, dann ist sie, wie dot schon sagte, abstrakt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

9

09.07.2011, 19:50

Naja ich hab mir gedacht, dass ja vielleicht im laufe der entwicklung ein turm noch andere spezifische fähigkeiten dazubekommt.
Das dann z.b. ein turm nebem schießen z.b. auch minen legen kann, oder einen graben machen, oder was weiß ich ^^

Wäre es dann etwa sinnvoll, wenn man diese Funktionen der Basisklasse übergibt ?! (Bei reinen virtuellen funktionen müsse diese Funktion dannn ja in JEDER turmart implementiert werden)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

09.07.2011, 20:59

Das ist jetzt die Frage. Es wäre auf jeden Fall zu überlegen, ob man es nicht vielleicht wirklich jedem Turm gibt und es dann optional über's Setup erledigt. Ehrlich gesagt bin ich mir an dieser Stelle etwas unsicher, was da die beste Lösung wäre.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige