Это поведение называется RTTI (информация о типе времени выполнения) . Эту технику лучше всего избегать, но она может быть полезна в некоторых ситуациях.
Есть два больших способа решить эту проблему. Первый способ - написать интерфейс с чисто виртуальной функцией, которая возвращает специфический для класса целочисленный ссылочный код. Этот код затем может быть использован для представления определенного типа. Эти целые числа могут храниться в определенном перечислении.
В производных классах вы можете затем переопределить метод и вернуть этот класс определенного типа.
Во время выполнения вы можете, например, вызвать Plugin-> getType (), и он вернет свой конкретный тип. Затем вы можете выполнить static_cast для указателя, чтобы получить правильный указатель производного типа обратно.
Второй способ - использовать typeid для получения класса объекта; но это зависит от компилятора. Вы также можете попробовать привести ваш указатель с помощью dynamic_cast; dynamic_cast возвращает нулевой указатель, когда он приведен к неверному типу; и действительный, когда приводится в правильном типе. Метод динамического приведения имеет большие издержки, чем метод getType, описанный выше.