Art der Variablen abrufen
Frage
Wenn ich richtig verstehe, kann TypID den tatsächlichen Typ im Polymorphismus bestimmen, während typeof nicht kann.
Ist es auch wahr, dass ihre Renditen für verschiedene Zwecke verwendet werden: Die Rückgabe von TypeOF wird als Typ -Schlüsselwort verwendet, das Variable definieren kann, die Rückgabe von Typid kann jedoch nicht?
Gibt es eine Möglichkeit, sowohl den tatsächlichen Typ für Polymorphismus zu erhalten als auch die Rückgabe als Typschlüsselwort zu verwenden, um eine andere Variable zu definieren? Ich hoffe, den abgeleiteten Klassentyp von einem Zeiger zu erhalten, der auf die Basisklasse zeigt und eine Variable oder einen Zeiger auf die abgeleitete Klasse definiert. Etwas wie:
baseclass *p = new derivedclass
typexxx(*p) *pp = dynamic_cast<typexxx(*p) *> (p);
// would like to convert the pointer from pointing to a base class
// to its derived class
Vielen Dank!
Lösung
C ++ 0x werde haben decltype
was so verwendet werden kann:
int someInt;
decltype(someInt) otherIntegerVariable = 5;
Aber für einfache alte C ++, leider nein.
ich vermute das decltype
Wird auch nicht viel Hilfe sein, da Sie den polymorphen Typ wollen, nicht der deklarierte Typ. Der direkteste Weg, das zu tun, was Sie wollen, ist zu versuchen, dynamisch zu einem bestimmten Typ zu gehen und nach zu überprüfen NULL
.
struct A {
virtual ~A() {}
};
struct B : public A {};
struct C : public A {};
int main() {
A* x = new C;
if(B* b_ptr = dynamic_cast<B*>(x)) {
// it's a B
} else if(C* c_ptr = dynamic_cast<C*>(x)) {
// it's a C
}
}
Andere Tipps
Annahme einer Hierarchie a <- b <- c
A * p = new AorBorC; // create new object of some sort
if ( dynamic_cast <C*>(p) ) {
C * c = dynamic_cast <C*>(p);
c->CFunc();
}
else if ( dynamic_cast <B*>(p) ) {
B * b = dynamic_cast <B*>(p);
b->BFunc();
}
else if ( dynamic_cast <A*>(p) ) {
A * a = dynamic_cast <A*>(p);
a->AFunc();
}
Wo Afunc, Bfunc, CFunc spezifisch für ihre jeweiligen Klassen und nicht virtuell. Offensichtlich kann dies etwas optimiert werden.