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

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

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

11 ответов

25 просмотров

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

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
Как это. А как же мы тогда вызываем через стрелочк...

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта