170 похожих чатов

Я не понимаю вот чего. Мы в указатель на базовый

класс кладем адрес экземпляра одного из производных классов. Когда функция получает на вход этот указатель на базовый, она понимает, что это базовый (она ведь не понимает, что это производный ). И вот мы разыменовываем указатель и вызываем метод базового (мы же не можем вызвать метод производного). Если этот метод виртуальный и переопределен в производном, то смотрится в таблице виртуальных функций "а точно ли мне надо вызывать этот метод базового, дай ка я посмотрю может там есть переход на настоящий метод производного?" И если такой переход есть, то вызывается метод производного. Вопрос вот в чем - откуда в рантайме оно (он? она?) понимает, что нужно перейти на переопределенный метод голос именно собаки, а не кошки при вызове метода голос животного? Ведь известно только, что это указатель на базовый и все. Никто заранее не знает какой именно производный туда засунули - кошку или собаку?

11 ответов

23 просмотра

В самом объекте класса, имеющего виртуальные функции, хранится указатель на их (в.ф.) таблицу, которая соответствует реальному типу.

https://www.linformaticien.com/images/00-articles/2021-10/pegasus/UNE_PEGASUS_03.jpg

The Pressbraker- Автор вопроса
Alexey Petrunyaka
В самом объекте класса, имеющего виртуальные функц...

То есть эта таблица не одна какая то общая и где то там хранится отдельно, а для каждого производного строится своя и соответсвенно через поинтер базового класса он (она? оно?) смотрит в эту таблицу именно для того фактического типа, что подсунули под видом производного?

The Pressbraker- Автор вопроса
Anatoly Shirokov
Для каждого класса своя

А теперь ясно. Я раньше думал есть просто таблица типа мапы - адрес в базовом - адрес в производном, я и думаю А КАКОМ ИМЕННО производном?

The Pressbraker
То есть эта таблица не одна какая то общая и где т...

Да, для каждого производного своя. Указатель на неё присваивается перед вызовом тела конструктора и восстанавливается на предыдущий после тела деструктора.

После разыменовывания базового вся виртуальность будет потеряна. Произойдет усечение до базового

The Pressbraker- Автор вопроса

Как это. А как же мы тогда вызываем через стрелочку это и есть разыменование и да, это базовый, само собой, но мы и вызываем метод базового, но если он виртуальный и переопределен, то происходит просто перескок на адрес другого метода. Он (она оно) думает, что запустил метод базового.

Андрей Таусинов
После разыменовывания базового вся виртуальность б...

Не: a->b тождественно (*a).b. Усечение - про создание нового объекта.

The Pressbraker
Как это. А как же мы тогда вызываем через стрелочк...

Виноват, перепутал со случаем, который Сергей ниже пояснил

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта