Рассмотрим эту простую иерархию:
class Base { public: virtual ~Base() { } };
class Derived : public Base { };
Попытка спускать Base* p в Derived* возможна с помощью dynamic_cast<Derived*>(p). Я думал, что dynamic_cast работает, сравнивая указатель vtable в p с тем, что находится в объекте Derived.
Но что, если мы выведем другой класс из Derived? Теперь имеем:
class Derived2 : public Derived { };
В этом случае:
Base* base = new Derived2;
Derived* derived = dynamic_cast<Derived*>(base);
Мы по-прежнему получаем успешное нажатие, хотя указатель vtable в Derived2 не имеет ничего общего с указателем vtable в Derived.
Как это работает? Как может dynamic_cast знать, был ли Derived2 получен из Derived (что, если Derived было объявлено в другой библиотеке)?
I am ищет конкретные сведения о том, как это работает (желательно в GCC, но другие тоже прекрасны). Этот вопрос не дубликат этого вопроса (который не указывает, как он работает).