Typumwanldung zwischen Klassen mit static_cast
-
Hallo,
folgendes Beispiel:
#include <iostream> using namespace std; class Demo { public: int i; }; class Abl : Demo { }; int main(void) { void *vp = new Demo; cout << vp->i << endl; // nicht zulässig Demo * dp = static_cast<Demo *>(vp); dp->i = 7; Abl * ap = new Abl; Demo * dp2 = static_cast<Demo *>(ap); // nicht zulässig dp2 = ap; // nicht zulässig Abl * ap2 = static_cast<Abl *>(dp); // nicht zulässig ap2 = dp; // nicht zulässig return 0; }Zeile 14 und 15: Was wird da gemacht und wieso ist die Zeile 15 nicht zulässig?
Zeile 19: Cast ab vom Typ Abl nach Typ Demo, wieso geht das nicht?
Zeile 21: Cast dp vom Typ Demo nach Typ Abl, wieso geht das nicht?Die Subklasse nach Hauptklasse sollte man doch casten können, da die Subklasse alle Methoden der Hauptklasse besitzt.
Danke

-
Kannst du alles im Buch deiner Wahl bzw. dem C++ Online-Kurs deiner Wahl nachlesen.
Das Forum ist nicht der geeignete Platz um Grundlagen zu lernen.
-
golfer schrieb:
Die Subklasse nach Hauptklasse sollte man doch casten können, da die Subklasse alle Methoden der Hauptklasse besitzt.
Bist du dir da sicher? Guck dir nochmal an, wie Abi und Demo sich zueinander verhalten. Abi hat hier keine "ist ein"-Beziehung zu Demo. Vielleicht suchst du das Wörtchen public…
Die restlichen Fragen sind dadurch wohl auch beantwortet, denn anscheinend sind dir solche Beziehungen ja bekannt. Ein Demo ist kein void, und ein Demo ist im Allgemeinen kein Abi. Der Versuch, ein Demo in eines dieser Objekte zu pressen, benötigt daher mehr als einen static_cast. Gleiche Regeln gelten auch für die Zeiger auf diese Typen.
-
SeppJ schrieb:
Ein Demo ist kein void, und ein Demo ist im Allgemeinen kein Abi. Der Versuch, ein Demo in eines dieser Objekte zu pressen, benötigt daher mehr als einen static_cast. Gleiche Regeln gelten auch für die Zeiger auf diese Typen.

-
[quote="hustbaer"]
SeppJ schrieb:
Ein Demo ist kein void, und ein Demo ist im Allgemeinen kein Abi. Der Versuch, ein Demo in eines dieser Objekte zu pressen, benötigt daher mehr als einen static_cast. Gleiche Regeln gelten auch für die Zeiger auf diese Typen.
Stimmt
. Korrektur: Außer im Fall von void*. Aus Gründen.
-
golfer schrieb:
class Abl : Demo { }; [...] Demo * dp2 = static_cast<Demo *>(ap); // nicht zulässig dp2 = ap; // nicht zulässig Abl * ap2 = static_cast<Abl *>(dp); // nicht zulässigDer Compiler hilft dir weiter:
demo.cpp:19:40: error: 'Demo' is an inaccessible base of 'Abl' demo.cpp:20:11: error: 'Demo' is an inaccessible base of 'Abl' demo.cpp:21:38: error: 'Demo' is an inaccessible base of 'Abl' demo.cpp:22:11: error: 'Demo' is an inaccessible base of 'Abl'Bei
class Abl : public Demo { };wird die base accessible und es kompiliert.
(bis auf die letzte Zuweisung)