hirthwork 06.02.2012 13:57 mcabber

вопрос для собеседования «Напишите программу, которая сможет вызвать чисто виртуальную функцию и будет терминирована». Если кандидат смог — собеседование провалено.

1. werehuman 06.02.2012 13:57 Psi+

меня смутило слово "терминирована"

2. 0xd34df00d 06.02.2012 13:58 Azoth_primary

Бля, я ведь могу.

3. hirthworkwerehuman /1 06.02.2012 13:58 mcabber

program terminated

4. werehuman 06.02.2012 13:59 Psi+

ок, что значит "чисто виртуальная функция"? Может всё-таки метод? Что значит чисто виртуальный метод? Абстрактный класс штоле?

5. hirthworkwerehuman /4 06.02.2012 14:01 mcabber

struct S{ virtual void f() = 0;};

7. werehumanhirthwork /5 06.02.2012 14:02 Psi+

у него нельзя попросту создать экземпляр класса, конпелятор не позволит

8. 0xd34df00dwerehuman /7 06.02.2012 14:03 Azoth_primary

Вызови это в конструкторе базового класса, а создай производный.
Или в деструкторе, один хуй

9. hirthwork0xd34df00d /8 06.02.2012 14:03 mcabber

бля! ты щас всех обречёшь на провал!

10. werehuman0xd34df00d /8 06.02.2012 14:03 Psi+

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

11. 0xd34df00dwerehuman /10 06.02.2012 14:04 Azoth_primary

Ты не знаешь плюсов.

12. 0xd34df00dhirthwork /9 06.02.2012 14:04 Azoth_primary

R! :3

13. hirthwork0xd34df00d /11 06.02.2012 14:05 mcabber

дваждую

14. werehuman0xd34df00d /11 06.02.2012 14:05 Psi+

код или gtfo

15. hirthworkwerehuman /14 06.02.2012 14:05 mcabber

gtfo

16. 0xd34df00dhirthwork /9 06.02.2012 14:06 Azoth_primary

Кстати, ЧСХ:
18:05:10 d34df00d deadtoo ~/Programming/tmp % make main
g++ main.cpp -o main
main.cpp: In constructor ‘Base::Base()’:
main.cpp:2:55: предупреждение: abstract virtual ‘virtual void Base::Foo()’ called from constructor
/tmp/ccBv8jtJ.o: In function `Base::Base()':
main.cpp:(.text._ZN4BaseC2Ev[_ZN4BaseC5Ev]+0x1f): undefined reference to `Base::Foo()'
collect2: выполнение ld завершилось с кодом возврата 1
^[[Amake: *** [main] Ошибка 1
18:05:11 d34df00d deadtoo ~/Programming/tmp % cat main.cpp
#include <iostream>
struct Base { virtual void Foo () = 0; Base () { Foo (); } };
struct Derived : Base { void Foo () { std::cout << "Hi! I'm derived :(" << std::endl; } };
int main () { new Derived (); }

Добавляем this→ перед вызовом, ворнинг уходит, но все так же нихуя не собирается:
18:05:34 d34df00d deadtoo ~/Programming/tmp % make main
g++ main.cpp -o main
/tmp/ccZp1Ts1.o: In function `Base::Base()':
main.cpp:(.text._ZN4BaseC2Ev[_ZN4BaseC5Ev]+0x1f): undefined reference to `Base::Foo()'
collect2: выполнение ld завершилось с кодом возврата 1
make: *** [main] Ошибка 1
18:05:36 d34df00d deadtoo ~/Programming/tmp % cat main.cpp
#include <iostream>
struct Base { virtual void Foo () = 0; Base () { this→Foo (); } };
struct Derived : Base { void Foo () { std::cout << "Hi! I'm derived :(" << std::endl; } };
int main () { new Derived (); }

17. 0xd34df00dwerehuman /14 06.02.2012 14:06 Azoth_primary

В конструкторе базового класса объект ведет себя как базовый класс, vtbl производного класса еще не инициализирована, поэтому вызов виртуальной функции приведет к /0.

18. werehuman0xd34df00d /16 06.02.2012 14:06 Psi+

петуня

19. werehumanwerehuman /18 06.02.2012 14:06 Psi+

петушня

20. 0xd34df00dwerehuman /19 06.02.2012 14:07 Azoth_primary

Че.

21. 0xd34df00dwerehuman /18 06.02.2012 14:07 Azoth_primary

Владюня!

22. werehuman0xd34df00d /17 06.02.2012 14:07 Psi+

язык костылей ёбана

23. 0xd34df00dwerehuman /22 06.02.2012 14:08 Azoth_primary

НЕа.

25. werehuman0xd34df00d /17 06.02.2012 14:11 Psi+

ичсх, компилятор вполне способен проверить валидность подобного вызова

27. hirthworkwerehuman /25 06.02.2012 14:11 mcabber

/26

28. 0xd34df00dhirthwork /26 06.02.2012 14:11 Azoth_primary

Океюшки.

29. 0xd34df00dwerehuman /25 06.02.2012 14:12 Azoth_primary

Нет, разрешимость этой задачи эквивалентна halting problem, очевидно.

30. gelraen 06.02.2012 14:20

почему провалено-то?

31. hirthworkgelraen /30 06.02.2012 14:26 mcabber

потому что это знание подобно некромантии и чернокнижеству

32. gelraenhirthwork /31 06.02.2012 14:29 imax

нуэ, мне не кажется невероятной ситуация когда человек может просто наступить на эти грабли

33. gelraenhirthwork /31 06.02.2012 14:30 imax

олсо, если человек знает о некромантии это ещё не значит что его будут окружать зомби и трупная вонь

34. dorfe 06.02.2012 19:44

Можно ещё проще: если в резюме есть бузд, то собеседование сразу провалено.

35. dorfehirthwork /3 06.02.2012 19:45

=)

Do you really want to delete ?