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!

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top