Hallo,
Ebenfalls hallo
- 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.
- 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
};
- 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