Интересно смотреть, как Иисус рассказывает про программирование (надо было курс называть "Божественное Программирование"))) (сарказм). Надеюсь, автор не обидится, рассказывает он, конечно, хорошо и очень доходчиво (мне кажется, что у него есть дар учителя). Но выглядит он (и всё это вместе) именно так)
@testtest-cf4mg7 жыл бұрын
Он помогает слепым новичкам достичь того что уже достигли обычные программисты, позволяя увидеть тем самым новичкам своими глазами разницу и пользу от ранней и поздней типизации. Пустые строки кода вмиг станут наполненными и нести какой-то логический смысл благодаря приобретенному дару. А если серьезней... Хотел лишь выразить благодарность автору за доступное объяснение))
@Magomedrasul72 жыл бұрын
Самое понятное видео из всего что я видел по vtable !)
@ruslanhamolia64092 жыл бұрын
Спасибо Вам, долго ломал голову, не мог понять из-за излишней глубины, но Вы всё четко по полочкам разложили. Огромное спасибо
@Ланс-м1в4 жыл бұрын
Спасибо. Для новичков то, что нужно.
@аноним-х3ш2 жыл бұрын
Это просто замечательно! Хотелось бы больше уроков по C++
@Puninvv9 жыл бұрын
Владимир, у Вас замечательно получается снимать видеоуроки! Желаю Вам успехов!
@valekprometey2 жыл бұрын
Спасибо!
@ASFlasher9 жыл бұрын
Интересные уроки, но есть не точности. Объект не хранит информацию о методах. В нем хранятся только поля. Можно проверить создав класс с кучей методов и посмотреть как его объект в памяти представлен или сделать sizeof. Если в классе нет ни одного поля то размер объекта будет не нулевой, например 1 байт. Если есть хоть одно поле, то размер объекта в не зависимости от количества функций будет равен этому полю. Если полей несколько, то там уже из-за выравнивания размер может варьировать. Если класс имеет виртуальные функции то еще добавляется указатель на vtable.В любом случае подписался, много интересного на канале :)
@VladimirMozhenkov9 жыл бұрын
+ASFlasher О каком языке программирования вы говорите? О каком компиляторе этого языка? В C++, например, (как я упонянал в этом видео) vtable - это только один из спосовоб реализации виртуальных методов, и реализация виртуальных таблиц тоже решается самим компилятором.
@ASFlasher9 жыл бұрын
+Vladimir Mozhenkov насчет реализации полиморфизма согласен, есть разные способы, но я не про это. Хранение функций в объекте класса не эффективно, т.к. в таком случае происходил бы большой объем дублирования информации. Намного логичней сделать так как сейчас реализовано во всех мне известных языках. Для класса функция существует в единичном экземпляре, и принимает не явно указатель на объект с которым работает. В С++ через указатель this.
@VladimirMozhenkov9 жыл бұрын
+ASFlasher Я с вами согласен. Я просто про то, что это не то, о чём было это видео. Вы правы, обычные методы не хранятся в каждом объекте индивидуально (по крайней мере не хранятся так ни в одном из известных мне компиляторах).
@aleksanderaksionau85556 жыл бұрын
и что получается это статический объект,...и обращение к одной виртуально странице просходит?
@ВиталийАлешко-ц4к2 жыл бұрын
Можно попросить объяснение работы try/catch? Не могу найти понятную информацию о том, как C++ делает прерывание стека вызовов, которое непонятно как повторить в языке C. За VTable спасибо, полиморфизм теперь стал ещё более понятным)
@Ivan-qb7kc7 жыл бұрын
Объясните, пожалуйста, почему нельзя создавать виртуальные шаблонные функции?
@shackoor3 жыл бұрын
большая ошибка подменить A на B прямо при старте)))
@ВладыкаВселенной-х8т3 жыл бұрын
Если в классах потомках не будет функций с такими же именами как и у предков то таблица виртуальных функций не будет использоваться компилятором, так что-ли?
@nmg_prm3 жыл бұрын
Все методы наследуются , если паблик. Виртуал для другого
@АлександрБ-у8у5 жыл бұрын
Ни**я еще не понял, но очень интересно!
@MrAmmid8 жыл бұрын
Остался вопрос: Как при вызове методов компилятор понимает, какую VTABLE нужно использовать? Ему нужно просмотреть все VTABLE?
@antonmyronenko45977 жыл бұрын
MrAmmid виртуальная таблица создается для каждого класса(содержащего вирт функции) в иерархии, а каждый объект, при создании, содержит "скрытый" указатель ссылающийся на вирт табл своего класса. Это все упрощенно. Немного усложняя, если в дочернем классе не переопределена вирт функция базового класса, то вирт таблица этого класса для этого метода просто будет хранить указатель на соответствующую функцию базового класса ( это не фиксировано и зависит от реализации)
@ArthurPozhidayev7 жыл бұрын
При использовании ссылки/указателя базового класса на производный, т.е. (A* p = new B;) можно вызвать у него переопределенный метод (p->f();), проблема здесь одна, компилятор должен заменить эту строку на конкретный адрес вызываемого метода, а таких методов 2. Поэтому подставляется адрес метода из таблицы, (p->pvtb->f();) Да, каждый объект ссылается на свою таблицу, но их внутреннее построение гарантирует одинаковое смещение для переопределенных методов. Т.е. если в памяти A::f() храниться по адресу 10, а B::f() - 20 (утрировано), то во всех таблицах ссылки на эти методы будут располагаться с 8-го байта (сначала в vtable идет тип для RTTI, потом указатель на offset-to-top для множественного наследования, а затем наши методы). И на этапе компиляции p->f() примет вид p->pvtb->8, напротив этой 8-ки в таблице адрес нужного нам метода, в нашем случае 20, так процессор перескочит на 20 байт и продолжит выполнение. Надеюсь не утомил ответом на годовалый вопрос (мало ли кому понадобится)
@GorgeousPuree6 жыл бұрын
Я не понимаю, это слишком сложно
@olivemaster32728 жыл бұрын
Блин как надоели учителя, которые сами не фига не знают. Нахватаются по верхам и начинают вещать всякое г.....
@user-aleks-Al-17 жыл бұрын
Ну так расскажите, в чем ошибки
@olivemaster32727 жыл бұрын
Грубейшие ошибки: 1) Объект класса не хранит в себе непосредственно информацию об конкретной виртуальной функции. Даже в самом начале создания объекта! (Ошибка на 5:35 минуте ролика). 2) VTBL не удаляет никакой информации из объекта класса! (Дикий бред на 6:03 минуте). 3) Объект класса не содержит в себе VTBL! (Ламмерская сказка 6:29 минута). Есть еще по мелочи ...
@TheDiscoLux7 жыл бұрын
лет 10 назад занимался построением своего языка, пересмотрел кучу исходников компиляторов и помню что данные базового класса вплотную лежали с данными производного. (предполагаю по sizeof без выравнивания можно посмотреть) а функции лежали в других местах. да вообще может все черт ногу сломит как компилятор расположить при оптимизации. тут смысл в видео просто для утрированого понимания как работает. может даже при каком-то большем кол-ве функций в объекте вообще хэш функцией искать .хз. как к примеру с большим оператором switch.
@aleksandrkravtsov87275 жыл бұрын
блэ) ну нафига путать то? всю жизнь все рисуют A как родитель B как наследник, сиди теперь каждый раз когда видишь B думай что это не то что всегда а наоборот)
@knzsoft4 жыл бұрын
Посмотрите UML. Автор использует нотацию UML. Можно считать UML неким стандартом де-факто для рисования классовых диаграмм. Привыкайте, а то будут проблемы на собеседованиях и в работе.