So I am trying to write a simple interpreter in c++, but ran into some problems. I have a Token class, which holds an enum TokenType, and a TokenValue object. The TokenValue class is the base class of several other classes (TV_String, TV_Int, and TV_Float).
Here is the code for the TokenValue and its children classes:
// TokenValue.h
class TokenValue
{
public:
    void* value = NULL;
    virtual bool operator ==(const TokenValue& tv) const
    {
        return typeid(this) == typeid(tv) && value == tv.value;
    }
};
class TV_Empty : public TokenValue {};
class TV_String : public TokenValue
{
public:
    std::string value;
    TV_String(std::string value); // The constructors just assign the value argument to the value field
};
class TV_Int : public TokenValue
{
public:
    int value;
    TV_Int(int value);
};
class TV_Float : public TokenValue
{
public:
    float value;
    TV_Float(float value);
};
Here's the code for Token:
// Token.h
class Token
{
public:
    enum class TokenType
    {
        // all the different types
    }
    TokenType type;
    TokenValue value;
    Token(TokenType type, TokenValue value); // just initialises type and value, nothing else
}
The problem I am having is that the value field is not being changed when I use any of the children classes (it always shows 00000000 when I print it, I assume that's the value of void* value = NULL, but not sure). From research I think it could be solved by using templates, but in my case I can't use templates because Token never know the type of its corresponding TokenValue.
So how can I override the type and value of the value field and access the correct value in the children classes, and in the == operator?
(Thanks to Jarod42 I realised it doesn't "override" the field, it creates a new field with a different type and the same name.)
 
     
    