Получение доступа к таблице виртуальных функций С++ (задание на Stepik)

Всем привет! На Stepik есть задание, которое заключается в том, что, имея иерархию классов, нам нужно узнать принадлежат ли объекты, передаваемые в функцию одному и тому же классу-наследнику или нет. Сделать это, очевидно, нужно через доступ к таблице виртуальных функций, ведь каждый объект класса ссылается именно на СВОЮ виртуальную функцию. Тогда если адреса виртуальных функций совпадут, то мы имеем объекты одного и того же класса. При этом в описании четко сказано, что на практике так действовать не стоит, а задание нужно исключительно для лучшего понимания того, как все устроено "под капотом". В общем, написал такой код:

bool check_equals(Expression const *left, Expression const *right)
{
    bool flag = true;
    for (int i = 0; i < 32; i++)
    {
        if (*(int*)left == *(int*)right)
            continue;
        else 
        {
            flag = false;
            break;
        }
    } 
    return flag;
}

Ожидал я что мне выпадет ошибка о том, что оператор приведения не определен, однако тестирующая система приняла задачу и я даже получил целых 4 балла! Ура! Ура! Ура! Но все же, как компилятор смог преобразовать указатель на объект одного из наших классов к указателю на int? Заранее спасибо за ваши ответы)

Реальзация иерархии классов:

struct Expression
{
    virtual double evaluate() const = 0;
    virtual ~Expression() {}
};

struct Number : Expression
{
    Number(double value)
        : value(value)
    {}
    double evaluate() const
    {
    return this->value;
    }

private:
    double value;
};

struct BinaryOperation : Expression
{
    /*
      Здесь op это один из 4 символов: '+', '-', '*' или '/', соответствующих операциям,
      которые вам нужно реализовать.
     */
    BinaryOperation(Expression const * left, char op, Expression const * right)
        : left(left), op(op), right(right)
    { }
    ~BinaryOperation()
    {
        delete left;
        delete right;
    }
    double evaluate() const
    {
        if (op == '+')
        {
            return left->evaluate() + right->evaluate();
        }
        if (op == '-')
        {
            return left->evaluate() - right->evaluate();
        }
        if (op == '*')
        {
            return left->evaluate() * right->evaluate();
        }
        if (op == '/')
        {
            return left->evaluate() / right->evaluate();
        }
    }

private:
    Expression const * left;
    Expression const * right;
    char op;
};

Ответы (0 шт):