Если вы хотите использовать абстрактную фабрику, как в приведенном выше коде, вам необходимо вернуть указатель на базовый класс. Это верно. И тогда вам нужно вызвать все функции через базовый указатель.
Кстати, пожалуйста, не используйте необработанные указатели. Вместо этого используйте указатели std::unique
.
Есть 2 возможных решения.
Добавьте функции интерфейса как не чистую, но все же виртуальную функцию в базовый класс с поведением по умолчанию.
virtual void differentFunction() {}
Из-за других чистых функций базовый класс по-прежнему является абстрактным. Это может привести к жирному интерфейсу. Но во многих случаях это приемлемое решение.
Вторая возможность - снизить указатель базового класса до необходимого вам указателя, используя dynamic_cast
и проверяя возвращаемое значение динамического c приведения.
if(mixerManager* mm = dynamic_cast<mixerManager*>(test)) {
mm->differentFunction();
}
Все это зависит, конечно, от общего дизайна и того, чего вы хотите достичь. Но приведенные выше 2 являются стандартными шаблонами.
Существуют также другие шаблоны проектирования, которые могут соответствовать вашим потребностям, например конструктор или прототип. Пожалуйста, проверьте.