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

operador de transmisión dinámica

El operador dynamic_cast puede convertir de forma segura un puntero o referencia de una clase base en un puntero o referencia de una clase derivada. La conversión falla y devuelve una dirección nula. Antes de que se diseñara dynamic_cast, C++ no podía implementar una conversión de una clase base virtual a una clase derivada. dynamic_cast está diseñado para resolver la conversión de clases base virtuales a clases derivadas.

operador typeid

El operador typeid permite determinar el tipo de un objeto en tiempo de ejecución. El resultado de typeid es const type_info&. El valor es una referencia a un objeto type_info que representa el tipo de type-id o expresión, según la forma de typeid utilizada.

clase type_info

La clase type_info describe la información de tipo generada por el compilador en un programa. Los objetos de esta clase pueden almacenar eficientemente punteros a nombres de tipos. La clase type_info también puede almacenar valores codificados adecuados para comparar dos tipos por igualdad o para comparar su orden de permutación. Las reglas de codificación y el orden de los tipos no están especificados y pueden variar de un programa a otro.

class type_info {
    
    
public:
    type_info(const type_info& rhs) = delete; // cannot be copied
    virtual ~type_info();
    size_t hash_code() const;
    _CRTIMP_PURE bool operator==(const type_info& rhs) const;
    type_info& operator=(const type_info& rhs) = delete; // cannot be copied
    _CRTIMP_PURE bool operator!=(const type_info& rhs) const;
    _CRTIMP_PURE int before(const type_info& rhs) const;
    size_t hash_code() const noexcept;
    _CRTIMP_PURE const char* name() const;
    _CRTIMP_PURE const char* raw_name() const;
};
#include <iostream>
using namespace std;

class Shape
{
    
    
public:
    virtual void Draw() = 0;
    virtual ~Shape() {
    
    };
};

class Circle :public Shape
{
    
    
public:
    void Draw() 
    {
    
    
        cout << "Circle Draw..." << endl;
    }
};


class Square :public Shape
{
    
    
public:
    void Draw()
    {
    
    
        cout << "Square Draw..." << endl;
    }
};

int main()
{
    
    
    Shape* p;
    Circle c;
    p = &c;
    p->Draw();
    if (dynamic_cast<Circle*>(p))
    {
    
    
        cout << "p is point to a Circle object" << endl;
        Circle* cp = dynamic_cast<Circle*>(p);    //安全向下转型
        cp->Draw();
    }
    else if (dynamic_cast<Square*>(p))
    {
    
    
        cout << "p is point to a Square object" << endl;
    }
    else
    {
    
    
        cout << "p is point to a Other object" << endl;
    }

    cout << endl;
    cout << typeid(*p).name() << endl;
    cout << typeid(Circle).name() << endl;

    if (typeid(Circle).name() == typeid(*p).name())
    {
    
    
        cout << "p is point to a Circle object" << endl;
        ((Circle*)p)->Draw();//会做对齐操作   reinterpret_cast不做对齐操作
    }
    else if (typeid(Square).name() == typeid(*p).name())
    {
    
    
        cout << "p is point to a Square object" << endl;
    }
    else
    {
    
    
        cout << "p is point to a Other object" << endl;
    }
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43912621/article/details/131264393
Recomendado
Clasificación