crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Задачка N5
LuckLess
  опции профиля:
сообщение 11.4.2008, 11:48
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 31
Регистрация: 10.10.2007
Пользователь №: 8

Спасибо сказали: 0 раз(а)




Репутация:   0  


встретил тут прикольный код..
АХТУНГ - КОМПИЛИРУЕМ МОЗГОМ!
class A
   {
   public:
      virtual ~A(){}
   };

class B : public A
   {
   };

class C :  public A
   {
   };

class D : public B, public C
   {
   };

void f()
   {
   throw D();
   }

int main()
   {
   try
      {
      f();
      }
   catch(const A& a)
      {
      std::cout << "Catched " << typeid(a).name() << " as A" << std::endl;
      }
   catch(const B& b)
      {
      std::cout << "Catched " << typeid(b).name() << " as B" << std::endl;
      }
   }


что будет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 11.4.2008, 11:57
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


По идее должен отработать:
catch(const B& b)
{
      std::cout << "Catched " << typeid(b).name() << " as B" << std::endl;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
archimed7592
  опции профиля:
сообщение 11.4.2008, 12:47
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 27.12.2007
Из: Moscow
Пользователь №: 56

Спасибо сказали: 0 раз(а)




Репутация:   0  


"as A", ибо срабатывает первый подходящий catch.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 11.4.2008, 12:54
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


archimed7592, думаю тут в другом дело... :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
archimed7592
  опции профиля:
сообщение 11.4.2008, 13:02
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 27.12.2007
Из: Moscow
Пользователь №: 56

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата
archimed7592, думаю тут в другом дело...
Хде слон, которого я не приметил? :)
P.S. Проверил на студии: "as B"... МинЖВ под рукой нет.
Но больше всего порадовало, как студия перед тем как выдать "as B" выдала warning со словами, мол catch B const & перекрыт первым catch'ем, который const A & :lol:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 11.4.2008, 13:07
Сообщение #6


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Потом я думаю LuckLess, сам скажет, как раз у тебя будет время подумать... :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
LuckLess
  опции профиля:
сообщение 11.4.2008, 13:18
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 31
Регистрация: 10.10.2007
Пользователь №: 8

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ха! Архимед попался! Пойду возьму с полки пирожек ;)
Цитата
ибо срабатывает первый подходящий

угу.. но тут есть завязочка.. подходящий ли тут A ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 11.4.2008, 13:41
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата
std::cout << "Catched " << typeid(B).name() << " as B" << std::endl;



после того, как сам решил задачку посмотрел на ответы.

Наследование у D от A идет косвенно, поэтому вариант A не подходит
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
LuckLess
  опции профиля:
сообщение 11.4.2008, 13:43
Сообщение #9


Студент
*

Группа: Новичок
Сообщений: 31
Регистрация: 10.10.2007
Пользователь №: 8

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата
Наследование у D от A идет косвенно, поэтому вариант A не подходит

не то ))

поксказка.. если B и C будут наследовать A виртуально, то будет "as A"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
archimed7592
  опции профиля:
сообщение 11.4.2008, 14:24
Сообщение #10


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 27.12.2007
Из: Moscow
Пользователь №: 56

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ambiguity? Лаки, ты жестокий человек :).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.12.2024, 8:51