цепочке наследования) по этому обьекту всегда сначала просматривается таблица виртуальных методов, которая уже содержит указатели на нужные функции?
никаких "в зависимости" и "сначала". вызовы виртуальных функций всегда транслируются в код который я привёл: ptr_A->f1() транслируется в ptr_A->vtable->f1_ptr()
да, но таблица vtable у каждого класса своя
если класс B отнаследован от A, то он включает все виртуальные функции класса A его таблица вирт. функций будет сначала сожержать все функции класса A, и затем доп. функции, которые добавлены в B поэтому указатель A* может обращаться к этой vtable как к своей собственной
но как он поймет какую именно ему функцию вызвать если таблица одна?
Конструктор наследника меняет указатель на vtable.
Очень упрощённо. Под каждую базу у нас есть структура, содержащая в качестве полей указатели на функции тех типов, что вы объявили виртуальными Для каждого наследника компилятор где-то создаёт объект структуры и заполняет указатели методами наследника В каждого наследника компилятор добавляет указатель на такой объект
Обсуждают сегодня