Te comento un poco para que entiendas... El lenguaje C / C++ carece de lo que se conoce en nuevos lenguajes mas actuales como la reflexion, basicamente la reflexion es la posibilidad de que programaticamente se puedan obtener metadatos sobre cada objeto o variable dentro de un lenguaje de programacion, en Java y .NET framework se pueden saber en tiempo de ejecucion cual es la clase del objeto cuales son las clases padre de esta, que interfaces implementa, que metodos tiene y se los puede invocar en runtine...
Esto no es posible en C / C++ por el hecho de que C / C++ es un lenguaje compilado y no interpretado, y no es posible en runtime tener este tipo de informacion...
Las facilidades de RTTI que provee C++ estandard es informacion basica del tipo de dato asi como algunos operadores seguros de casteo entre tipo de datos...
para hacer uso de rtti, hay un operador llamado typeid(...) que aplicado a un tipo de dato o una variable / instancia nos da como resultado un objeto de tipo type_info con algunos metodos como name(), y algunos operadores de comparacion...
Esto es para saber en tiempo de ejecucion de que tipo es una determinada variable, pero solo eso, y generalmente el resultado de typeid(...).name() varia entre ejeciciones del mismo programa y hasta de corridas en distintas maquinas, asi que no se deberia usar para reconocer el tipo del objeto o serializacion...
Un ejemplo de esto seria asi:
Código:
#include<typeinfo>
#include<iostream>
class Base {
public:
virtual void hacerAlgoBase() {
std::cout << "Estoy haciendo algo en la clase base..." << std::endl;
}
};
class Derivada: public Base {
public:
virtual void hacerAlgoDerivada() {
std::cout << "Estoy haciendo algo en un metodo de la clase derivada" << std::endl;
}
};
int main(int argc, char** argv) {
Base* claseBase = new Base();
Base* claseDerivada = new Derivada();
claseBase->hacerAlgoBase();
claseDerivada->hacerAlgoBase();
// Aca uso RTTI para inferir que claseDerivada es una instancia de Derivada y casteo acorde de forma segura
if (typeid(claseDerivada) == typeid(Derivada)) {
Derivada* casteada = dynamic_cast<Derivada*>(claseDerivada);
// Es seguro castear porque el typeid me da igual
// Es seguro llamar a metodos de la clase derivada una vez casteados
casteada->hacerAlgoDerivada();
}
delete claseBase;
delete claseDerivada;
return 0;
}
Mas que esto no se puede hacer con el lenguaje C++, hay algunos frameworks que te permiten hacer reflection pero no estan del todo funcionales o son muy complejos de usar...
Saludos
Pablo