среда, 12 апреля 2023 г.

[prog.c++] На RSDN засветили одну из задачек с собеседования в Тинькофф

Вот в этой теме: Как удаляется vptr?

Насколько я помню, код из задачи воспроизведен точно. Разве что, мне кажется, изначально в классе Base не было виртуального деструктора. К нему нужно было прийти в процессе обсуждения поведения примера.

Если мне не изменяет мой склероз, то нужно было рассказать что напечатает этот пример, почему и что в нем следовало бы поправить.

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

Полагаю, этого хватило, т.к. у меня сложилось ощущение, что интервьюера больше интересовало понимание того, что эта самая таблица меняется в процессе жизни объекта. Т.е. когда объект конструируется и вызывается конструктор базового класса эта таблица одна (там находятся указатели на реализации виртуальных методов именно базового класса). Когда объект уже сконструирован, то таблица другая -- актуальная для именно этого типа объекта. Когда объект разрушается, то таблица вновь меняется.

Без этого понимания сложно будет объяснить какой именно из print-ов будет вызван и почему.

Добавлю, что меня собеседовал один человек и вопросов о том "утечет ли vptr" или "что будет с виртуальным указателем" (чтобы не подразумевалось на RSDN под этим термином) не было. И интервьюер, и само собеседование мне лично показались более чем адекватными. Так что негатив, который в обсуждении на RSDN был высказан, я не понимаю и не разделяю.

PS. Подробнее о том, как меня занесло на собеседования в Тинькофф и почему в итоге от предложения отказался я рассказывал в прошлом году.

2 комментария:

sv комментирует...

По-моему, таблица виртуальных объектов хранится гдето в статической глобальной памяти (не знаю, как это по-научному называется). Это логично, все смещения виртуальных функций известны на этапе компиляции, можно их один раз создать и больше не трогать.

eao197 комментирует...

@sv

На RSDN засветили вот ссылки, может будут полезны для понимания того, как устроены vtable:

https://shaharmike.com/cpp/vtable-part1/
https://shaharmike.com/cpp/vtable-part2/