Pregunta

Si he entendido bien, typeid puede determinar el tipo real de polimorfismo, mientras typeof no puede.

¿Es cierto también que sus declaraciones se utilizan para diferentes propósitos: el regreso de typeof se utiliza como palabra clave que puede definir el tipo variable, pero el retorno de typeid no puede

?

¿Hay alguna manera de conseguir tanto el tipo real de polimorfismo y utilizar el retorno como tipo de palabra clave para definir otra variable? Espero conseguir el tipo de clase derivada de un puntero que apunta a la clase base y definir una variable o un puntero a la clase derivada. Algo así como:

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

Muchas gracias!

¿Fue útil?

Solución

c ++ 0x tendrá decltype que se puede utilizar como este :

int someInt;
decltype(someInt) otherIntegerVariable = 5;

pero para el viejo y simple C ++, por desgracia, no.

supongo que decltype realidad no va a ser de mucha ayuda, aunque ya que desea que el tipo polimórfico, no el tipo declarado. La forma recta hacia adelante más que hacer lo que quiere es intentar dinámico reparto a un tipo particular y comprobar si hay 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
    }
}

Otros consejos

Suponiendo una jerarquía 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();
}

Cuando AFunc, BFunc, CFunc son específicos de sus respectivas clases y no virtual. Obviamente, esto puede ser optimizado en cierta medida.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top