Однако если всё-таки используется наследование реализации... Например, если пишется "каркас-заготовка", или решается прикладная задача, где иерархии идут от самой предметной области...
То супервызовы всё равно не нужны, вместо них лучше использовать "версионированные методы".
Пример в ББ - тип Containers.Container. Возьмём его процедуру HandleCtrlMsg.
Она имеет реализацию. Более того, она предназначена для расширения в потомках. Однако - она не EXTENSIBLE! Как так? Очень просто.
Container имеет другую процедуру - HandleCtrlMsg2, объявленную как EMPTY (т.е. пустышку) и с экспортом "-" - т.е. только для реализации.
HandleCtrlMsg в нужном месте вызывает HandleCtrlMsg2.
В итоге - в типах-расширениях мы определяем HandleCtrlMsg2. Супервызова не используем - вызывать нечего... Наоборот, базовая процедура вызывает нас, в тот момент, когда считает нужным.
Защита от ошибок - во-первых, вызвать HanleCtrlMsg2 напрямую никто не может, т.к. она экспортирована только для реализации (хе-хе, ни в одном другом языке такого нет

).
В то же время мы, определяя в своих типах дополнительные действия, не можем умышленно или намеренно забыть или вызвать не вовремя базовую процедуру. Т.е. как именно и когда что выполнять, решает базовый тип, а не расширения.