RTTI (información de tipo de tiempo de ejecución) en C++

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;
}
Producción

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

Categories C++

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *