Рассмотрим эту простую иерархию:
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, но другие тоже прекрасны). Этот вопрос не дубликат этого вопроса (который не указывает, как он работает).