вопрос для собеседования «Напишите программу, которая сможет вызвать чисто виртуальную функцию и будет терминирована». Если кандидат смог — собеседование провалено.
Кстати, ЧСХ: 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 (); }
В конструкторе базового класса объект ведет себя как базовый класс, vtbl производного класса еще не инициализирована, поэтому вызов виртуальной функции приведет к /0.
меня смутило слово "терминирована"
Бля, я ведь могу.
program terminated
ок, что значит "чисто виртуальная функция"? Может всё-таки метод? Что значит чисто виртуальный метод? Абстрактный класс штоле?
struct S{ virtual void f() = 0;};
у него нельзя попросту создать экземпляр класса, конпелятор не позволит
Вызови это в конструкторе базового класса, а создай производный.
Или в деструкторе, один хуй
бля! ты щас всех обречёшь на провал!
нельзя создать класс, производный от абстрактного, не определив при этом все "чистые виртуальные" методы.
Ты не знаешь плюсов.
R! :3
дваждую
код или gtfo
gtfo
Кстати, ЧСХ:
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 (); }
В конструкторе базового класса объект ведет себя как базовый класс, vtbl производного класса еще не инициализирована, поэтому вызов виртуальной функции приведет к /0.
петуня
петушня
Че.
Владюня!
язык костылей ёбана
НЕа.
ичсх, компилятор вполне способен проверить валидность подобного вызова
http://ideone.com/bqpjX
/26
Океюшки.
Нет, разрешимость этой задачи эквивалентна halting problem, очевидно.
почему провалено-то?
потому что это знание подобно некромантии и чернокнижеству
нуэ, мне не кажется невероятной ситуация когда человек может просто наступить на эти грабли
олсо, если человек знает о некромантии это ещё не значит что его будут окружать зомби и трупная вонь
Можно ещё проще: если в резюме есть бузд, то собеседование сразу провалено.
=)