Тёмный

Таблица Виртуальных Методов - vtable 

Volodya Mozhenkov
Подписаться 49 тыс.
Просмотров 16 тыс.
50% 1

Один из способов хранения информации о классе (и соответственно о его объектов) использует таблицу виртуальных методов для хранения ссылок на виртуальные методы (извиняюсь за тавтологию).
Проблема, которую решает этот метод - это невозможность узнать какие будут использоваться виртуальные методы у объекта того или иного класса.

Опубликовано:

 

14 окт 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 32   
@ИльяАпролов
@ИльяАпролов 5 лет назад
Спасибо за видео, Кхал Дрого
@maxlich9139
@maxlich9139 7 лет назад
Интересно смотреть, как Иисус рассказывает про программирование (надо было курс называть "Божественное Программирование"))) (сарказм). Надеюсь, автор не обидится, рассказывает он, конечно, хорошо и очень доходчиво (мне кажется, что у него есть дар учителя). Но выглядит он (и всё это вместе) именно так)
@testtest-cf4mg
@testtest-cf4mg 7 лет назад
Он помогает слепым новичкам достичь того что уже достигли обычные программисты, позволяя увидеть тем самым новичкам своими глазами разницу и пользу от ранней и поздней типизации. Пустые строки кода вмиг станут наполненными и нести какой-то логический смысл благодаря приобретенному дару. А если серьезней... Хотел лишь выразить благодарность автору за доступное объяснение))
@Magomedrasul7
@Magomedrasul7 2 года назад
Самое понятное видео из всего что я видел по vtable !)
@ruslanhamolia6409
@ruslanhamolia6409 2 года назад
Спасибо Вам, долго ломал голову, не мог понять из-за излишней глубины, но Вы всё четко по полочкам разложили. Огромное спасибо
@Puninvv
@Puninvv 9 лет назад
Владимир, у Вас замечательно получается снимать видеоуроки! Желаю Вам успехов!
@аноним-х3ш
@аноним-х3ш 2 года назад
Это просто замечательно! Хотелось бы больше уроков по C++
@Ланс-м1в
@Ланс-м1в 4 года назад
Спасибо. Для новичков то, что нужно.
@ВиталийАлешко-ц4к
@ВиталийАлешко-ц4к 2 года назад
Можно попросить объяснение работы try/catch? Не могу найти понятную информацию о том, как C++ делает прерывание стека вызовов, которое непонятно как повторить в языке C. За VTable спасибо, полиморфизм теперь стал ещё более понятным)
@valekprometey
@valekprometey 2 года назад
Спасибо!
@ASFlasher
@ASFlasher 9 лет назад
Интересные уроки, но есть не точности. Объект не хранит информацию о методах. В нем хранятся только поля. Можно проверить создав класс с кучей методов и посмотреть как его объект в памяти представлен или сделать sizeof. Если в классе нет ни одного поля то размер объекта будет не нулевой, например 1 байт. Если есть хоть одно поле, то размер объекта в не зависимости от количества функций будет равен этому полю. Если полей несколько, то там уже из-за выравнивания размер может варьировать. Если класс имеет виртуальные функции то еще добавляется указатель на vtable.В любом случае подписался, много интересного на канале :)
@VladimirMozhenkov
@VladimirMozhenkov 9 лет назад
+ASFlasher О каком языке программирования вы говорите? О каком компиляторе этого языка? В C++, например, (как я упонянал в этом видео) vtable - это только один из спосовоб реализации виртуальных методов, и реализация виртуальных таблиц тоже решается самим компилятором.
@ASFlasher
@ASFlasher 9 лет назад
+Vladimir Mozhenkov насчет реализации полиморфизма согласен, есть разные способы, но я не про это. Хранение функций в объекте класса не эффективно, т.к. в таком случае происходил бы большой объем дублирования информации. Намного логичней сделать так как сейчас реализовано во всех мне известных языках. Для класса функция существует в единичном экземпляре, и принимает не явно указатель на объект с которым работает. В С++ через указатель this.
@VladimirMozhenkov
@VladimirMozhenkov 9 лет назад
+ASFlasher Я с вами согласен. Я просто про то, что это не то, о чём было это видео. Вы правы, обычные методы не хранятся в каждом объекте индивидуально (по крайней мере не хранятся так ни в одном из известных мне компиляторах).
@aleksanderaksionau8555
@aleksanderaksionau8555 6 лет назад
и что получается это статический объект,...и обращение к одной виртуально странице просходит?
@shackoor
@shackoor 2 года назад
большая ошибка подменить A на B прямо при старте)))
@АлександрБ-у8у
@АлександрБ-у8у 5 лет назад
Ни**я еще не понял, но очень интересно!
@Ivan-qb7kc
@Ivan-qb7kc 7 лет назад
Объясните, пожалуйста, почему нельзя создавать виртуальные шаблонные функции?
@ВладыкаВселенной-х8т
Если в классах потомках не будет функций с такими же именами как и у предков то таблица виртуальных функций не будет использоваться компилятором, так что-ли?
@nmg_prm
@nmg_prm 3 года назад
Все методы наследуются , если паблик. Виртуал для другого
@olivemaster3272
@olivemaster3272 8 лет назад
Блин как надоели учителя, которые сами не фига не знают. Нахватаются по верхам и начинают вещать всякое г.....
@user-aleks-Al-1
@user-aleks-Al-1 7 лет назад
Ну так расскажите, в чем ошибки
@olivemaster3272
@olivemaster3272 7 лет назад
Грубейшие ошибки: 1) Объект класса не хранит в себе непосредственно информацию об конкретной виртуальной функции. Даже в самом начале создания объекта! (Ошибка на 5:35 минуте ролика). 2) VTBL не удаляет никакой информации из объекта класса! (Дикий бред на 6:03 минуте). 3) Объект класса не содержит в себе VTBL! (Ламмерская сказка 6:29 минута). Есть еще по мелочи ...
@TheDiscoLux
@TheDiscoLux 7 лет назад
лет 10 назад занимался построением своего языка, пересмотрел кучу исходников компиляторов и помню что данные базового класса вплотную лежали с данными производного. (предполагаю по sizeof без выравнивания можно посмотреть) а функции лежали в других местах. да вообще может все черт ногу сломит как компилятор расположить при оптимизации. тут смысл в видео просто для утрированого понимания как работает. может даже при каком-то большем кол-ве функций в объекте вообще хэш функцией искать .хз. как к примеру с большим оператором switch.
@aleksandrkravtsov8727
@aleksandrkravtsov8727 5 лет назад
блэ) ну нафига путать то? всю жизнь все рисуют A как родитель B как наследник, сиди теперь каждый раз когда видишь B думай что это не то что всегда а наоборот)
@knzsoft
@knzsoft 4 года назад
Посмотрите UML. Автор использует нотацию UML. Можно считать UML неким стандартом де-факто для рисования классовых диаграмм. Привыкайте, а то будут проблемы на собеседованиях и в работе.
@aleksandrkravtsov8727
@aleksandrkravtsov8727 4 года назад
@@knzsoft спасибо за ответ не в тему вопроса)
@MrAmmid
@MrAmmid 8 лет назад
Остался вопрос: Как при вызове методов компилятор понимает, какую VTABLE нужно использовать? Ему нужно просмотреть все VTABLE?
@antonmyronenko4597
@antonmyronenko4597 7 лет назад
MrAmmid виртуальная таблица создается для каждого класса(содержащего вирт функции) в иерархии, а каждый объект, при создании, содержит "скрытый" указатель ссылающийся на вирт табл своего класса. Это все упрощенно. Немного усложняя, если в дочернем классе не переопределена вирт функция базового класса, то вирт таблица этого класса для этого метода просто будет хранить указатель на соответствующую функцию базового класса ( это не фиксировано и зависит от реализации)
@ArthurPozhidayev
@ArthurPozhidayev 7 лет назад
При использовании ссылки/указателя базового класса на производный, т.е. (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 байт и продолжит выполнение. Надеюсь не утомил ответом на годовалый вопрос (мало ли кому понадобится)
@GorgeousPuree
@GorgeousPuree 6 лет назад
Я не понимаю, это слишком сложно
@arcticshine3741
@arcticshine3741 5 лет назад
Плохо объянил, все намного проще можно подать
Далее
Когда ООП поможет вам?
8:48
Просмотров 12 тыс.
Фабричный метод
15:48
Просмотров 60 тыс.
Нормализация в базе данных
15:14
Агрегация и Композиция
19:49
Просмотров 57 тыс.
С++ 12. RTTI, dynamic_cast, vtables.
1:30:35
Просмотров 7 тыс.
Текстовые данные в SQL
13:51
Просмотров 7 тыс.
Интерфейс в ООП
13:46
Просмотров 44 тыс.