Рассмотрим "полноценные" в смысле смоллтолка объекты, т.е. те, в которых можно вызывать виртуальные методы.
Для таких объектов надо написать функцию f, которая на входе получает любой полноценный объект класса К, а на выходе возвращает тоже полноценный объект класса К1, причем К1 является потомком класса К и имеет все приватные, защищенные и открытые поля и методы класса К, и еще одно открытое поле -- счетчик. Вы расслабились? рано! Каждый вызов метода объекта класса К1 должен сначала инкрементировать то самое новое открытое поле-счетчик, а затем уже вызывать соответствующий метод своего родителя.
1. Порутчикам Ржевским со своими динамическими языками -- молчать. Я и так знаю, что вы скажете.
2. Почему рассматриваем только полноценные объекты -- если объект не полноценный, то при путешествии объекта класса К1 он быстро станет рассмативаться как объект класса К и перестанет инкрементировать счетчик (то, что в плюсах возможны "неполноценные" объекты я не собираюсь обсуждать -- это уведет далеко).
3. Для хаскелистов -- как я понимаю, у вас нет объектов, а только алгебраические типы данных. Для вас нужно задачу как-то переформулировать (или взять какую-то реализацию объектной системы, но в этом будет сложно разбираться).
4. На плюсах я сейчас вижу только "грязный" способ реализации -- использовать прямой доступ к vtbl на запись. Может кто предложит получше?
5. Дополненительное усложение: перед своим уничтожением объект должен записать счетчик в лог.