Если вы делаете это, то вы, вероятно, злоупотребляете наследованием; Наследование, вопреки распространенному мифу, предназначено не для создания пользовательских хуков / обработчиков, а для включения альтернативных реализаций.
Если вы хотите, чтобы ваш пользователь предоставлял какую-то функцию / ловушку / обратный вызов, то вы должны определить интерфейс, который предоставляет только те методы, которые должен определить ваш пользователь. Затем вы должны потребовать от пользователя передать экземпляр этого интерфейса конструктору вашего объекта или передать функции, которая в этом нуждается.
Агрегация, делегирование и составление часто лучше и безопаснее шаблонов проектирования, чем наследование; принуждение других пользователей к наследованию от вашего класса невероятно рискованно, поскольку предоставляет пользователю множество возможностей нарушить контракт вашего класса или лишить законной силы инвариант вашего базового класса.