браинбенч: throw-spec в унаследованных функциях
От: chipsеt Россия http://merlinko.com
Дата: 10.11.07 07:17
Оценка:
Привет.

Проходил браинбенч С++ и встретился там вопрос такого порядка:

"If you are overriding a virtual function with a specified throw specification list,
how should you change the throw-spec list in a new function?"

1. You must make it less strict
2. You must make it at least as strict
3. You must make it more strict
4. какая-то фигня
5. какая-то фигня

Насколько я знаю, наиболее правильным ответом было бы "You must make it at least as strict or less strict". Поэтому я выбрал второй номер. Но поскольку я набрал всего 4.01 балл, видимо на этот вопрос я ответил неправильно.

Хотелось бы узнать, как же действительно можно изменить список исключений когда переписываешь функцию в классе-ребенке?

— Чип
... << RSDN@Home 1.2.0 alpha rev. 784>>
http://fool.exler.ru/sm/val.gif"Всё что не убивает нас, делает нас сильнее..."
Re: браинбенч: throw-spec в унаследованных функциях
От: remark Россия http://www.1024cores.net/
Дата: 10.11.07 07:41
Оценка: 4 (2) +3
Здравствуйте, chipsеt, Вы писали:

C>"If you are overriding a virtual function with a specified throw specification list,

C>how should you change the throw-spec list in a new function?"

C>1. You must make it less strict

C>2. You must make it at least as strict
C>3. You must make it more strict
C>4. какая-то фигня
C>5. какая-то фигня


Правильный ответ:
2. You must make it at least as strict

Нельзя делать спецификацию более слабой, т.е. добавлять новые исключения, т.к. нарушает интерфейс базового класса. Пользователь базового класса рассчитывает на вылет только специфицированных в *базовом* классе исключений. Если из производного класса будут лететь другие исключения, то это нарушение интерфейса.

Что бы лучше понять, ты можешь думать о спецификации исключений аналогично ковариантному возвращаемому значению виртуальной функции. Допустим виртуальная функция в базовом классе возвращает std::ostream&. Тогда функция в производном классе может сделать возвращаемое значение "более строгим", например std::ostringstream&. Но не может сделать его "менее строгим", например std::ios&, т.к. тогда совершенно не понятно, что делать, если производный класс возвращает std::istream&, а код вызывающий функцию через базовый класс ждёт std::ostream&.

Т.е. всё дело в сохранении интерфейса базового класса.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: браинбенч: throw-spec в унаследованных функциях
От: igna Россия  
Дата: 10.11.07 10:48
Оценка: +1 :))
Здравствуйте, chipsеt, Вы писали:

C>Насколько я знаю, наиболее правильным ответом было бы "You must make it at least as strict or less strict".


Это как понимать? Вроде "at least as strict or less strict" означает "любой". Смотри:

"at least as strict" = "по меньшей мере такой же строгий" = "такой же строгий или более строгий"
"less strict" = "менее строгий"
"at least as strict or less strict" = "по меньшей мере такой же строгий или менее строгий" = "такой же строгий или более строгий или менее строгий" = "любой"

Или я приоритеты операций такой же и или неверно понимаю?
Re[2]: браинбенч: throw-spec в унаследованных функциях
От: chipsеt Россия http://merlinko.com
Дата: 10.11.07 16:37
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, chipsеt, Вы писали:


C>>Насколько я знаю, наиболее правильным ответом было бы "You must make it at least as strict or less strict".


I>Это как понимать? Вроде "at least as strict or less strict" означает "любой". Смотри:


I>"at least as strict" = "по меньшей мере такой же строгий" = "такой же строгий или более строгий"

I>"less strict" = "менее строгий"
I>"at least as strict or less strict" = "по меньшей мере такой же строгий или менее строгий" = "такой же строгий или более строгий или менее строгий" = "любой"

I>Или я приоритеты операций такой же и или неверно понимаю?


Угу, меня сбило в какую сторону это "at least as strict": в сторону уменьшения или увеличения. Насколько я понимаю,
"at least as strict" вполне может иметь смысл "как максимум равный но можно и меньше". Правда это уже больше в переводческий форум
... << RSDN@Home 1.2.0 alpha rev. 784>>
http://fool.exler.ru/sm/val.gif"Всё что не убивает нас, делает нас сильнее..."
Re[2]: браинбенч: throw-spec в унаследованных функциях
От: chipsеt Россия http://merlinko.com
Дата: 10.11.07 16:37
Оценка:
Здравствуйте, remark, Вы писали:

R>Здравствуйте, chipsеt, Вы писали:


C>>"If you are overriding a virtual function with a specified throw specification list,

C>>how should you change the throw-spec list in a new function?"

C>>1. You must make it less strict

C>>2. You must make it at least as strict
C>>3. You must make it more strict
C>>4. какая-то фигня
C>>5. какая-то фигня


R>Правильный ответ:

R>2. You must make it at least as strict

R>Нельзя делать спецификацию более слабой, т.е. добавлять новые исключения, т.к. нарушает интерфейс базового класса. Пользователь базового класса рассчитывает на вылет только специфицированных в *базовом* классе исключений. Если из производного класса будут лететь другие исключения, то это нарушение интерфейса.


Ах! Значит делать более слабой -> увеличивать количество исключений, делать менее слабой -> уменьшать!
И это значит что я ответил правильно, я крут, ЫЫЫ!

R>


... << RSDN@Home 1.2.0 alpha rev. 784>>
http://fool.exler.ru/sm/val.gif"Всё что не убивает нас, делает нас сильнее..."
Re[3]: браинбенч: throw-spec в унаследованных функциях
От: Vain Россия google.ru
Дата: 11.11.07 02:12
Оценка:
Здравствуйте, chipsеt, Вы писали:

C>Угу, меня сбило в какую сторону это "at least as strict": в сторону уменьшения или увеличения. Насколько я понимаю,

C>"at least as strict" вполне может иметь смысл "как максимум равный но можно и меньше". Правда это уже больше в переводческий форум
at least — как минимум
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.