Pergunta

Se bem entendi, typeid pode determinar o tipo real no polimorfismo, enquanto typeof não pode.

Também é verdade que seus retornos são utilizados para finalidades diferentes:o retorno de typeof é usado como palavra-chave de tipo que pode definir variável, mas o retorno de typeid não pode?

Existe alguma maneira de obter o tipo real do polimorfismo e usar a palavra-chave return as type para definir outra variável?Espero obter o tipo de classe derivada de um ponteiro apontando para a classe base e definir uma variável ou um ponteiro para a classe derivada.Algo 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

Muito obrigado!

Foi útil?

Solução

c++0x terá decltype que pode ser usado assim:

int someInt;
decltype(someInt) otherIntegerVariable = 5;

mas para o velho c++, infelizmente, não.

eu suponho que decltype também não ajudará muito, já que você deseja o tipo polimórfico, não o tipo declarado.A maneira mais direta de fazer o que você deseja é tentar fazer uma conversão dinâmica para um tipo específico e verificar se há 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
    }
}

Outras dicas

Assumindo uma hierarquia 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();
}

Onde AFunc, BFunc, CFunc são específicos para suas respectivas classes, e não virtuais.Obviamente, isso pode ser otimizado um pouco.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top