Это почти наверняка не то, что вы хотите сделать. Вместо этого используйте виртуальный метод:
class Base {
public:
virtual void getSomeFunc() = 0;
// ... etc etc ...
};
тогда вы можете написать:
Base* ptr = get_a_base_instance_ptr_from_somewhere();
ptr->getSomeFunc();
В вашем коде вы пытались иметь auto
иметь либо типа p
или типа q
. Но auto
имеет только одиночный тип. И тип, который может принимать как указатель на Derived_1
, так и указатель на Derived_2
, это ... да, вы уже догадались: Base*
.
edit: Если вы не можете изменить класс Base
, Derived_1
и Derived_2
, вы можете рассмотреть возможность использования std::variant<Derived_1*, Derived_2*>
и использования посещения для вызова соответствующего метода для каждого из эти типы. Если вы ранее не использовали варианты, см. Справочную страницу CPP на std::variant
. Для получения информации о том, как написать посетителя для использования с вариантом, см. Этот вопрос SO:
Как работает std :: visit с std :: option?