Interesting C/C++ interview questions

Krokodil
Уже с Приветом
Posts: 139
Joined: 22 Apr 2002 12:41

Post by Krokodil »

Vovka wrote:
A. Fig Lee wrote:... почему дестрактор должен быть виртуальным.


Только не "почему", а "когда", наверное?
Тех, кто дестракторы делает виртуальными _всегда_, я бы сам никогда до программирования не допустил бы. :)

Никакого вреда в объявлении деструктора виртуальным на мой взгляд нет. Объясните, почему таких людей нельзя допускать до программирования? Какие ужасные последствия могут быть вследствии этого?
Hamster
Уже с Приветом
Posts: 11475
Joined: 20 Nov 2000 10:01
Location: Escondido, CA

Post by Hamster »

У объявления деструктора виртуальным такие последствия:
будет создаваться vtable, даже когда он не нужен;
объект будет из-за этого занимать больше места;
деструктор будет всегда вызываться через vtable и его вызов не может быть inlined. Даже если тело деструктора пустое.
Протоукр
Krokodil
Уже с Приветом
Posts: 139
Joined: 22 Apr 2002 12:41

Post by Krokodil »

Hamster wrote:У объявления деструктора виртуальным такие последствия:
будет создаваться vtable, даже когда он не нужен;
объект будет из-за этого занимать больше места;
деструктор будет всегда вызываться через vtable и его вызов не может быть inlined. Даже если тело деструктора пустое.

Согласен со всем, но не могу понять почему последствия столь фатальны что людей нельзя допускать до программирования :D Несколько байт потерянной памяти и накладные на вызов функции вместо инлайна? У нас в конторе у многих выработался рефлекс описывать деструкторы virtual. Когда их спрашиваешь почему, то они говорят, что ТАК НАДО. Это сущие мелочи, по сравнению с другими вещами которые призодилось видеть...
Vovka
Уже с Приветом
Posts: 1906
Joined: 14 Mar 2001 10:01

Post by Vovka »

Krokodil wrote: Согласен со всем, но не могу понять почему последствия столь фатальны что людей нельзя допускать до программирования :D


Ну, "недопуска до программирования" я там смайлик поставил, и не такое бывает. :mrgreen:

А по сути - вам Hamster уже ответил. Если объекты маленькие и их много, то это может иметь значение.

Ещё есть причины:
1. (идеологическая) если что-то не необходимо, то это не нужно.
2. (педагогическая) если человек пишет вирт. дест. всегда, то он, быть может, не знает, когда и почему они нужны.
3. (технологическая) виртуальность деструктора ещё является чем-то вроде документации о назначении и использовании данного класса. Если деструктор не виртуальный - значит класс не может (и не предназначен) быть базой, и соответственно наоборот.
uncle_Pasha
Уже с Приветом
Posts: 19935
Joined: 30 Aug 2000 09:01
Location: WA

Post by uncle_Pasha »

Vovka wrote:Ну, "недопуска до программирования" я там смайлик поставил, и не такое бывает. :mrgreen:
Ещё есть причины:
1. (идеологическая) если что-то не необходимо, то это не нужно.
2. (педагогическая) если человек пишет вирт. дест. всегда, то он, быть может, не знает, когда и почему они нужны.
3. (технологическая) виртуальность деструктора ещё является чем-то вроде документации о назначении и использовании данного класса. Если деструктор не виртуальный - значит класс не может (и не предназначен) быть базой, и соответственно наоборот.


Я бы наоборот - не допускал к программированию тех, кто не объявляет деструктор виртуальным, без четкого понимания зачем это надо. :)

Лишние байты - это ерунда. "Если деструктор не виртуальный - значит класс не может (и не предназначен) быть базой" - это Вы так решили для этого класса. А когда-нибудь, на n-ном году жизни проекта, кто-то иной решит иначе. И не проверит. А на n+1-ом году жизни еще кто-то сделает указатель на базовый класс....

Нет уж. Лучше пусть пишут виртуальный, даже если не понимают, зачем это надо.

Удачи!
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

Vovka wrote:
Krokodil wrote: Согласен со всем, но не могу понять почему последствия столь фатальны что людей нельзя допускать до программирования :Д


Ну, "недопуска до программирования" я там смайлик поставил, и не такое бывает. :мргреен:

А по сути - вам Хамстер уже ответил. Если объекты маленькие и их много, то это может иметь значение.

Ещё есть причины:
1. (идеологическая) если что-то не необходимо, то это не нужно.
2. (педагогическая) если человек пишет вирт. дест. всегда, то он, быть может, не знает, когда и почему они нужны.
3. (технологическая) виртуальность деструктора ещё является чем-то вроде документации о назначении и использовании данного класса. Если деструктор не виртуальный - значит класс не может (и не предназначен) быть базой, и соответственно наоборот.

Наоборот. Я бы Вас не допуска. :mrgreen: Виртуальный дестрактор - ето сейф. Сделал и забыл. Годится практически везде. Невиртуальный - вещь очень скользкая надо об етом всегда помнить и быть начеку. Нет, такой хокей нам не нужен! :mrgreen:
Верить нельзя никому - даже себе. Мне - можно!
Krokodil
Уже с Приветом
Posts: 139
Joined: 22 Apr 2002 12:41

Post by Krokodil »

A. Fig Lee wrote:Наоборот. Я бы Вас не допуска. :mrgreen: Виртуальный дестрактор - ето сейф. Сделал и забыл. Годится практически везде. Невиртуальный - вещь очень скользкая надо об етом всегда помнить и быть начеку. Нет, такой хокей нам не нужен! :mrgreen:

Кто здесь допуски выдает? Выдайте мне пожалуйста!
Vovka
Уже с Приветом
Posts: 1906
Joined: 14 Mar 2001 10:01

Post by Vovka »

uncle_Pasha wrote: это Вы так решили для этого класса. А когда-нибудь, на n-ном году жизни проекта, кто-то иной решит иначе.


Иначе решить нельзя.
Если класс в самом начале не задумывался как базовый, то он таким быть не должен. Если хотите реюзить - включите это класс как данные. Если у класса нет виртуальных методов и protected членов (а у класса без вирт. дуструктора таких быть просто не может), то не может быть ни одной причины предпочесть наследование включению.

При этом я совершенно с вами согласен, что если есть сомнение - то надо делать деструктор виртуальным.
TLK
Уже с Приветом
Posts: 305
Joined: 09 Feb 2001 10:01
Location: Nizhniy Novgorod -> MD

Re: Interesting C/C++ interview questions

Post by TLK »

Dima wrote:кто только писал, блин, STL для шестой студии?


DinkumWare.
Take a look at some patches for MSVC STL:

http://www.dinkumware.com/vc_fixes.html
Bst.Rgds.TLK.
jawabean
Уже с Приветом
Posts: 945
Joined: 08 Sep 1999 09:01

Post by jawabean »

почитал вашу дискуссию про вирутальные деструкторы и понял, что я был всегда прав когда считал что на интервью неважно что говорить. важно как говорить и как себя вести.
uncle_Pasha
Уже с Приветом
Posts: 19935
Joined: 30 Aug 2000 09:01
Location: WA

Post by uncle_Pasha »

Vovka wrote:
uncle_Pasha wrote: это Вы так решили для этого класса. А когда-нибудь, на n-ном году жизни проекта, кто-то иной решит иначе.


Иначе решить нельзя.


Опасность в том, что ++ проекты - они долгоживущие (в смысле, живут дольше программистов, их начинавших). Спустя время, кому-то "Иначе решить нельзя" может не показаться столь безаппеляционным.

Vovka wrote:Если класс в самом начале не задумывался как базовый, то он таким быть не должен. Если хотите реюзить - включите это класс как данные.


Если класс не задумывался как базовый, почему бы не использовать struct?
Может это кого-то и остановит в будущем?
Vovka wrote:Если у класса нет виртуальных методов и protected членов (а у класса без вирт. дуструктора таких быть просто не может), .

это я совсем не понял...
За сим и откланиваюсь.

Удачи!
tchicago
Уже с Приветом
Posts: 1009
Joined: 16 Sep 2001 09:01
Location: USA

Post by tchicago »

Ну вот, сейчас еще и скучающие C++-ники переругаются между собой. Может еще использование goto обсудить? :mrgreen:

Встречал такой вопрос (скорее, не вопрос, а предложение темы для разговора): где и когда используется ключевое слово friend? Хорошо это или плохо? Почему?
interrupt
Уже с Приветом
Posts: 4022
Joined: 08 Dec 1999 10:01
Location: USA <-> Moscow

Post by interrupt »

A. Fig Lee wrote:Наоборот. Я бы Вас не допуска. :mrgreen: Виртуальный дестрактор - ето сейф. Сделал и забыл. Годится практически везде. Невиртуальный - вещь очень скользкая надо об етом всегда помнить и быть начеку. Нет, такой хокей нам не нужен! :mrgreen:


А я бы вас... :mrgreen: Деструктор нужно делать виртульным, только когда это нужно. Иначе, при большом кол-ве маленьких обьектов - накладные расходы и по памяти и по скорости... А если этого можно избежать, то нужно избегать. Аргументы "пусть возьмет компьютер помощнее" - не принимаются :)
yocto
Уже с Приветом
Posts: 3640
Joined: 13 Sep 1999 09:01
Location: Canada

Post by yocto »

uncle_Pasha wrote:Если класс не задумывался как базовый, почему бы не использовать struct?
Может это кого-то и остановит в будущем?


Так ведь объявление типа через struct не запрещает наследование.
uncle_Pasha
Уже с Приветом
Posts: 19935
Joined: 30 Aug 2000 09:01
Location: WA

Post by uncle_Pasha »

yocto wrote:
uncle_Pasha wrote:Если класс не задумывался как базовый, почему бы не использовать struct?
Может это кого-то и остановит в будущем?


Так ведь объявление типа через struct не запрещает наследование.


Оно объясняет смысл данного элемента данных.
99% что никому не прийдет в голову наследоваться от struct в дальнейшем

Удачи!

Return to “Работа и Карьера в IT”