¿Cómo se implementa normalmente dynamic_cast?

¿Es el tipo de verificación una mera comparación de enteros? ¿O tendría sentido tener unGetTypeId ¿Función virtual para distinguir cuál lo haría una comparación de enteros?

(Simplemente no quiero que las cosas sean una comparación de cadenas en los nombres de clase)

EDITAR: lo que quiero decir es que, si a menudo espero el tipo incorrecto, ¿tendría sentido usar algo como:

struct Token
{
    enum {
        AND,
        OR,
        IF
    };
    virtual std::size_t GetTokenId() = 0;
};

struct AndToken : public Token
{
    std::size_t GetTokenId() { return AND; }
};

Y usa elGetTokenId miembro en lugar de confiar endynamic_cast.

Respuestas a la pregunta(4)

Su respuesta a la pregunta