Рассмотрим следующее:
- B наследует от A и переопределяет функцию печати.
- A имеет статическую функцию, которая принимает void *, отбрасывает ее в и вызывает функцию виртуальной печати.
-
Если void * изначально был B, он вызывает A:: print или B:: print?
#include <iostream> class A { public: static void w(void *p) { A *a = reinterpret_cast<A*>(p); a->print(); } virtual void print() { std::cout << "A" << std::endl; } }; class B : public A { public: void print() { std::cout << "B" << std::endl; } }; int main () { B b; A::w(&b); }
Это печатает B для меня.
Кажется, что void *, который был добавлен в A, все еще знает о переопределенной функции печати B. Причина не сразу понятна.
Может кто-нибудь объяснить мне, если это поведение, на которое я могу положиться, или это просто какая-то случайность, которая работает, потому что это небольшой пример (например, как возвращение ссылки на локальную переменную не всегда будет segfault в небольших программах).