dynamic_casts und Basisklassenpointer

Hallo,

noch ein paar C++ fragen:

  1. Kann man Pointer auf abgeleitete Klassen auf Basisklassen umwandeln,und wie siehts umgekehrt aus?
  2. Wo kann man eine Liste der Fehlerflags der iostream-Klasse finden (ios::end)?
  3. Wieso funktioniert dieses Programm nicht (hab es aus einem Buch abgeschieben und hoffentlich keine Fehler gemacht). Es bring einen Debug error (von Visual C++) und Abnormal Programm Termination unterm Dos Fenster! Es liegt an dem dynamic_cast operator! Muss ich da irgendwas im Compiler einstellen (bin schon mal mit der RTTI so richtig auf die Schnauze gefallen!)?

Vielen Dank im vorraus

Trager Rupert

Also, hier ist mein Problemkind:

#include
class Basis

{
public:
virtual void ident() {cout(base_ptr))
{
abg_ptr->eigene_Methode();
}
return 0;
}

Hallo,

Ebenfalls hallo

  1. Kann man Pointer auf abgeleitete Klassen auf Basisklassen
    umwandeln,und wie siehts umgekehrt aus?

Ersteres ja, letzteres ist gefährlich. (In Alltagsbegriffen: jedes Feuerwehrauto kann man als Auto benutzen, aber ein Auto ist nur dann als Feuerwehrauto verwendbar, wenn es rot ist und lalü machen kann. Wenn man ein anderes Auto als Feuerwehrauto benutzt, gibt’s wahrscheinlich einen Unfall.)

Nimm Deine Beispielklassen aus 3.:

 Basis \*pBasis = new Basis;
 Abgel \*pAbgel = dynamic\_cast(pBasis); // das gibt Ärger...
 pAbgel-\>eigene\_Methode(); // autsch!

Zur Laufzeit ist aber nicht unbedingt klar, was Sache ist. Vielleicht sieht es ja auch so aus:

 Abgel \*pZuerst = new Abgel;
 Basis \*pBasis = dynamic\_cast(pZuerst); // ok
 Abgel \*pAbgel = dynamic\_cast(pBasis); // so geht es
 pAbgel-\>eigene\_Methode(); // Glück gehabt.

Damit sowas erkannt werden kann, wird die run-time type information (RTTI) benötigt. Damit kann während der Ausführung eines dynamic_cast geprüft werden, ob er unbedenklich ist.

  1. Wo kann man eine Liste der Fehlerflags der iostream-Klasse
    finden (ios::end)?

Öh… ios::end ist kein Fehler. ‚end‘, ‚beg‘ und ‚cur‘ geben z.B. die Startposition für die Methode ‚seekoff‘ an.

Ansonsten sind das hier die enums aus :

 enum io\_state { goodbit = 0x00,
 eofbit = 0x01,
 failbit = 0x02,
 badbit = 0x04 };

 enum open\_mode { in = 0x01,
 out = 0x02,
 ate = 0x04,
 app = 0x08,
 trunc = 0x10,
 nocreate = 0x20,
 noreplace = 0x40,
 binary = 0x80 };

 enum seek\_dir { beg=0, cur=1, end=2 };

 enum { skipws = 0x0001,
 left = 0x0002,
 right = 0x0004,
 internal = 0x0008,
 dec = 0x0010,
 oct = 0x0020,
 hex = 0x0040,
 showbase = 0x0080,
 showpoint = 0x0100,
 uppercase = 0x0200,
 showpos = 0x0400,
 scientific = 0x0800,
 fixed = 0x1000,
 unitbuf = 0x2000,
 stdio = 0x4000
 };
  1. Wieso funktioniert dieses Programm nicht (hab es aus einem
    Buch abgeschieben und hoffentlich keine Fehler gemacht). Es
    bring einen Debug error (von Visual C++) und Abnormal Programm
    Termination unterm Dos Fenster! Es liegt an dem dynamic_cast
    operator! Muss ich da irgendwas im Compiler einstellen (bin
    schon mal mit der RTTI so richtig auf die Schnauze gefallen!)?

Ja. Ausprobiert mit Version 6.0 von Visual Studio. Der Compiler beschwert sich in der Standardeinstellung über einen gefährlichen dynamic_cast und empfiehlt, mittels /GR+ die RTTI zu aktivieren. Ein anschließender Probelauf liefert (nicht überraschend) eine Exception im dynamic_cast.

Die MSDN-Library sagt dazu:
_"The Enable Run-Time Type Information option (/GR) causes the compiler to add code to check object types at run time. When this option is specified, the compiler defines the _CPPRTTI preprocessor macro. The option is cleared (/GR–) by default.

To find this option in the development environment, click Settings on the Project menu. Then click the C/C++ tab, and click C++ Language in the Category box."_

Und siehe: es geht.

Gruß + viel Glück

Ralf

Hallo Rupert

  1. Kann man Pointer auf abgeleitete Klassen auf Basisklassen
    umwandeln,und wie siehts umgekehrt aus?

das geht in beide Richtungen. Man sollte aber in C++ (wie Du es
in Code fuer dynamic_cast gemacht hast) die operatoren dynamic_cast und static_cast benutzen (Beispiel siehe
unten in Deinem Programm). Dabei castet der static_cast operator von einer abgeleiteten klasse zur
Basisklasse (das geschieht ja auch implizit) und der dynamic_cast
operator castet von einer basisklasse zur abgeleiteten. Er
liefert 0, falls die Konversion nicht gelungen ist.

  1. Wo kann man eine Liste der Fehlerflags der iostream-Klasse
    finden (ios::end)?

Z.B im Buch:
Die C++ Standardbibliothek
Schader, Kuhlins
Springer Verlag

oder vielleicht unter
http://www.sgi.com/tech/stl

  1. Wieso funktioniert dieses Programm nicht (hab es aus einem
    Buch abgeschieben und hoffentlich keine Fehler gemacht). Es
    bring einen Debug error (von Visual C++) und Abnormal Programm
    Termination unterm Dos Fenster! Es liegt an dem dynamic_cast
    operator! Muss ich da irgendwas im Compiler einstellen (bin
    schon mal mit der RTTI so richtig auf die Schnauze gefallen!)?

Falls Du mit dem Visual-Studio arbeitest, musst Du RTTI
aktivieren (unter Projekt/Einstellungen/C,C++/…)

> #include

// besser: 
#include // neuer C++ standard benutzt header ohne .h
// Dann sind all Klassen im namespace std eingebettet, dieser
// muss durch 
using namespace std;
// sichtbar gemacht werden


> class Basis  
> {  
> public:  
> virtual void ident() {cout(&abg\_obj);

 if(base\_ptr == 0)cout(base\_ptr))


> {  
> abg\_ptr-\>eigene\_Methode();  
> }

// das sollte korrekt sein, schoen und hilfreich waere eine 
// Fehlerbehandlung
 else // if abg\_ptr == 0
 cout

Gruss Rolf

Rolf und Ralf …
… vielen Dank, ihr habt mir sehr geholfen!

Mit freundlichen Gruß

Trager Rupert