класс кладем адрес экземпляра одного из производных классов. Когда функция получает на вход этот указатель на базовый, она понимает, что это базовый (она ведь не понимает, что это производный ). И вот мы разыменовываем указатель и вызываем метод базового (мы же не можем вызвать метод производного). Если этот метод виртуальный и переопределен в производном, то смотрится в таблице виртуальных функций "а точно ли мне надо вызывать этот метод базового, дай ка я посмотрю может там есть переход на настоящий метод производного?" И если такой переход есть, то вызывается метод производного. Вопрос вот в чем - откуда в рантайме оно (он? она?) понимает, что нужно перейти на переопределенный метод голос именно собаки, а не кошки при вызове метода голос животного? Ведь известно только, что это указатель на базовый и все. Никто заранее не знает какой именно производный туда засунули - кошку или собаку?
В самом объекте класса, имеющего виртуальные функции, хранится указатель на их (в.ф.) таблицу, которая соответствует реальному типу.
https://www.linformaticien.com/images/00-articles/2021-10/pegasus/UNE_PEGASUS_03.jpg
То есть эта таблица не одна какая то общая и где то там хранится отдельно, а для каждого производного строится своя и соответсвенно через поинтер базового класса он (она? оно?) смотрит в эту таблицу именно для того фактического типа, что подсунули под видом производного?
Для каждого класса своя
А теперь ясно. Я раньше думал есть просто таблица типа мапы - адрес в базовом - адрес в производном, я и думаю А КАКОМ ИМЕННО производном?
Да, для каждого производного своя. Указатель на неё присваивается перед вызовом тела конструктора и восстанавливается на предыдущий после тела деструктора.
После разыменовывания базового вся виртуальность будет потеряна. Произойдет усечение до базового
Как это. А как же мы тогда вызываем через стрелочку это и есть разыменование и да, это базовый, само собой, но мы и вызываем метод базового, но если он виртуальный и переопределен, то происходит просто перескок на адрес другого метода. Он (она оно) думает, что запустил метод базового.
Не: a->b тождественно (*a).b. Усечение - про создание нового объекта.
Виноват, перепутал со случаем, который Сергей ниже пояснил
Обсуждают сегодня