Получение доступа к таблице виртуальных функций С++ (задание на 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;
};