On Sunday 03 June 2001 11:53, Matthias Petermann wrote:
Hallo,
erst einmal vielen Dank für Eure Hilfe. So funktioniert es prima, allerdings bin ich gleich auf ein weiteres Problem gestoßen:
[cut]
Wie man erkennen kann wollte ich der abgeleiteten Klasse "bahn" eine zusätzliche Methode "notbremsen" geben, die aber _nicht_ Element der Klasse "bus" sein soll.
aber egcs meint... t.C:46: no matching function for call to `c_fahrzeug::notbremsen ()'
:(
Logisch, in c_fahrzeug (und von dem Typ sind nun mal die Pointer) ist die Methode abgeleitet. Es wäre etwas viel verlangt von einem Compiler den Zustand des Pointers zur Laufzeit vorherzusagen (einen Interpreter juckt das nicht, weil er den Code sowieso erst zur Laufzeit auswertet).
Es gibt also offensichtlich 2 Möglichkeiten:
a) Du sorgst dafür, dass c_fahrzeug eine Methode notbremsen() hat.
a1) ------------- class c_fahrzeug{ //.... void notbremsen(); }; c_fahrzeug::notbremsen(){printf("dummy\n");} ------------ ->was Dir, wie Du sehen wirst nix bringt, der Compiler nimmt dann nämlich immer die Notbremse von c_fahrzeug (schließlich ist der Pointer von welchem Typ? Richtig: c_fahrzeug.)
a2) also sagen wir ihm "löse erst zur Laufzeit auf": ------------- class c_fahrzeug{ //.... virtual void notbremsen()=0; }; ------------- -> was Dir den Fehler "cannot instantiate abstract class bus" einbringen wird, denn theoretisch könnte man ja auf die Idee kommen die abstrakte Methode notbremsen() auch bei bus anzuwenden, wo sie nicht definiert wurde, und das will der Compiler verhindern. a3) kombinieren wir mal beides: ------------- class c_fahrzeug{ //.... virtual void notbremsen(); }; c_fahrzeug::notbremsen(){printf("dummy\n");} ------------ -> was weiterhelfen würde, aber bus hätte nun auch eine dummy-Notbremse. (Was ja nicht schaden muss.)
b) Du benutzt einen Cast ------------ ((bahn*)(fahrzeug[2]))->notbremsen(); ------------ -> Was aber sehr gefährlich sein kann, sobald nicht eine bahn sondern ein bus in diesem Element gespeichert ist - dann kann die Methode nämlich ihre Daten nicht finden und man bekommt sehr seltsame Abstürze (zugegeben bei diesem Beispiel wird es funktionieren, aber nur, weil es gar keine Speicherelemente einsetzt).
Was hab ich jetzt noch falsch gemacht?
Das Buch noch nicht komplett durchgearbeitet.
Ich schlage vor, nach diesem Ausflug in die Gefilde der Fortgeschrittenen solltest Du erst einmal systematisch die Tutorials in Deinem Buch durcharbeiten und verstehen - oder zumindest (wie ich das oft mache) das Buch komplett durchlesen, um einen Überblick zu erhalten, was man alles beachten muss.
Konrad
PS.: bitte schick Deinen Quelltext das nächste mal als Attachment, das läßt sich besser speichern und austesten.
PPS.: Funktionen und Methoden, die nix zurückliefern sind normalerweise vom Typ void.