En C++, RTTI (información de tipo de tiempo de ejecución) es un mecanismo que expone información sobre el tipo de datos de un objeto en tiempo de ejecución y está disponible solo para las clases que tienen al menos una función virtual. Permite determinar el tipo de un objeto durante la ejecución del programa.
Repartos en tiempo de ejecución
La conversión en tiempo de ejecución, que comprueba que la conversión es válida, es el método más sencillo para determinar el tipo de tiempo de ejecución de un objeto mediante un puntero o una referencia. Esto es especialmente beneficioso cuando necesitamos convertir un puntero de una clase base a un tipo derivado. Cuando se trata de la jerarquía de herencia de clases, generalmente se requiere la conversión de un objeto. Hay dos tipos de fundición:
- Upcasting: cuando un puntero o una referencia de un objeto de clase derivado se trata como un puntero de clase base.
- Downcasting: cuando un puntero de clase base o una referencia se convierte en un puntero de clase derivado.
Usando ‘ dynamic_cast ‘: en una jerarquía de herencia, se usa para convertir un puntero de clase base a una clase secundaria. En una conversión exitosa, devuelve un puntero del tipo convertido y, sin embargo, falla si intentamos convertir un tipo no válido, como un puntero de objeto que no es del tipo de la subclase deseada.
Por ejemplo, dynamic_cast usa RTTI y el siguiente programa falla con el error » canny dynamic_cast ‘b’ (de tipo ‘clase B*’) para escribir ‘clase D*’ (el tipo de fuente no es polimórfico)» porque no hay una función virtual en la clase base B.
CPP
// C++ program to demonstrate // Run Time Type Identification(RTTI) // but without virtual function #include <iostream> using namespace std; // initialization of base class class B {}; // initialization of derived class class D : public B {}; // Driver Code int main() { B* b = new D; // Base class pointer D* d = dynamic_cast<D*>(b); // Derived class pointer if (d != NULL) cout << "works"; else cout << "cannot cast B* to D*"; getchar(); // to get the next character return 0; }
Agregar una función virtual a la clase base B hace que funcione.
CPP
// C++ program to demonstrate // Run Time Type Identification successfully // With virtual function #include <iostream> using namespace std; // Initialization of base class class B { virtual void fun() {} }; // Initialization of Derived class class D : public B { }; // Driver Code int main() { B* b = new D; // Base class pointer D* d = dynamic_cast<D*>(b); // Derived class pointer if (d != NULL) cout << "works"; else cout << "cannot cast B* to D*"; getchar(); return 0; }
works
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA