No video

Лекция 22. Строение vtables. Проблемы виртуальных функций

  Рет қаралды 3,352

Мещерин Илья

Мещерин Илья

Күн бұрын

Пікірлер: 12
@MrKwoork
@MrKwoork 25 күн бұрын
00:00 5.6 memory layout of polymorphic objects with multiple inheritance 13:50 non virtual thunc 17:50 важная оговорка 18:30 virtual inheritance 26:00 заключение по теме 31:20 про блог shaharmike 32:50 5.7 no obvious problems with virtual functions 39:05 популярный вопрос на собесе 44:32 пример pure virtual function call 50:25 порядок создания полиморфного объекта 58:20 пример из ТОП3 кринж примеров, как работают ссылки не виртуальные методы
@arturkoritko2663
@arturkoritko2663 Күн бұрын
Оставлю этот комментарий для таких же "Окошников" как и я, короче, если вы любите все проверять своими ручками и не понимаете, почему ничего не получается, знайте, вижловский компилятор, по каким-то не ведомым причинам, считает себя самым хитрым и умным, и раздувает из мухи слона там, где это не надо, поэтому при множественном наследовании размеры класса sizeof(Son) с иерархией: Бабушка, от нее виртуально мама, папа, от них сын, у каждого виртуальный метод и целочисленное поле, из 48байт превращаются в 72
@alexpopov445
@alexpopov445 8 ай бұрын
Илья, здравствуйте! Спасибо за лекции! В примере 38:10 вы говорите, что при создании объекта Derived вызывается конструктор Base. Но у Base есть pure virtual метод, следовательно, класс Base абстрактный. А насколько я знаю, нельзя создать объект абстрактного класса. Тогда, почему вы пишите для него конструктор? Возможно, это опечатка, и вы имели ввиду не pure virtual метод, а просто virtual?
@mesyarik
@mesyarik 8 ай бұрын
Нельзя создать объект - это не значит, что не может быть конструктора. Это лишь значит, что не может быть переменных типа Base. Конструктор Base все равно вызывается, прежде чем начнет работать конструктор Derived. Все примеры можно проверить самостоятельно))
@alexpopov445
@alexpopov445 8 ай бұрын
Ааа переменных Тогда всё понятно Как-то не интуитивно, что "нельзя создавать объекты" значит не "нельзя создавать объекты" в принципе, а нельзя создавать переменные)
@Snick3rSdoto
@Snick3rSdoto 9 ай бұрын
31:20 можно ссылку?
@pijuma8539
@pijuma8539 Ай бұрын
Нашли ссылку?
@allex608
@allex608 Ай бұрын
shahar mike C++ vtables
@nicholasspezza9449
@nicholasspezza9449 Ай бұрын
ну да
@user-le5ce5ot7q
@user-le5ce5ot7q 5 ай бұрын
53:23 Студент спросил почему не та же самая ошибка вылазит, считаю, что преподаватель зря упустил этот вопрос: в предыдущем случае была ошибка линкера и Лектор пояснил это тем, что у Pure virtual функции нет определения и поэтому линкер выдает ошибку, а с этом примере в терминал вылазит текст о том, что была вызвана чисто виртуальная функция, а также вызывается функция Aborted, тогда почему в первом примере линкер не нашел определение, если у чисто виртуальной функции есть полноценная заглушка, которая может вызываться???? Думаю, что студент это имел ввиду
@gooldenboy666
@gooldenboy666 2 ай бұрын
я думаю, что все правильно. Так как CE намного приятнее ловить, чем ошибки в run-time. В первом случае компилятор сразу видит неопределенную функцию т.к для него она обычная, а не virtual. А в втором все окей, до того момента как в run-time не будет выбираться нужная функция.
@Bro_Flame
@Bro_Flame Ай бұрын
Если я не ошибаюсь, то в стандарте (по крайней мере, в С++20) сказано, что вызов pure virtual метода в конструкторах или деструкторах приводит к UB. Поэтому появлении linker error в первом случае и RE с выводом сообщения "Pure virtual function called!" во втором - это особенности реализации g++. Если провести такие же эксперименты на других компиляторах, то результат может быть другим: Например, при использовании clang++ (version 17.0.6) в обоих случаях будет RE с выводом сообщения, а если взять MSVC, то результат такой же, как и на g++. Более того, если использовать qualified-id при вызове pure virtual method и добавить его определение в абстрактном классе, то результаты компиляции опять будут разными. Описывать все полученные результаты я не стану, но ниже добавлю набросок кода, который позволит вам быстро проверить все эти случаи, если будет желание: #include struct Base { virtual void h() = 0; void f() { std::cout
Kind Waiter's Gesture to Homeless Boy #shorts
00:32
I migliori trucchetti di Fabiosa
Рет қаралды 15 МЛН
白天使选错惹黑天使生气。#天使 #小丑女
00:31
天使夫妇
Рет қаралды 15 МЛН
Can This Bubble Save My Life? 😱
00:55
Topper Guild
Рет қаралды 86 МЛН
Please Help Barry Choose His Real Son
00:23
Garri Creative
Рет қаралды 23 МЛН
Лекция 43. Вывод типов auto, decltype, decltype(auto)
1:23:49
Мещерин Илья
Рет қаралды 2,6 М.
ALF 2.6 Basics: Models & Your own Model
1:10:41
ALF — Quantum Monte Carlo
Рет қаралды 43
КАК УСТРОЕН TCP/IP?
31:32
Alek OS
Рет қаралды 54 М.
Лекция 42. Expired values. Copy elision. Return value optimization
1:14:36
Мещерин Илья
Рет қаралды 1,9 М.
All Rust string types explained
22:13
Let's Get Rusty
Рет қаралды 166 М.
Лекция 48. SFINAE, std::enable_if
1:22:23
Мещерин Илья
Рет қаралды 1,8 М.
Kind Waiter's Gesture to Homeless Boy #shorts
00:32
I migliori trucchetti di Fabiosa
Рет қаралды 15 МЛН