Одна возможность - малоиспользуемая чисто виртуальная функция с реализацией:
virtual int longDescriptiveName() = 0
{
return 0;
}
Это заставляет производные классы переопределять его. Затем они могут вызвать реализацию базового класса в одиночку, если хотят только такого поведения.
Кроме того, вам необходимо убедиться, что иерархия наследования является плоской, а не многослойной, что, в общем, хорошо, так как наследование достаточно хрупкое, не складывая слои.