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

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

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

11 ответов

5 просмотров

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

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

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

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

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

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
TCodePointer = record cp: CodePointer; name: string; cnt: Integer; next: TCodePointerArray; // этот тип ещё неизвестен end; TCodePointerArray = array of ...
notme
9
Привет ) есть такой кусок кода, он считывает ini файл. my $conf = Config::IniFiles->new( -file => $ini_file ); if (!$conf) { $self->my_die('cannot_read_cfg', ...
Kolya lastname
7
Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Блин, интересно, кто-нибудь когда-нибудь переписывал какую-нибудь игру с x86 на arm? Вообще, такое возможно?
Alan 🔝 Бэброу
13
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Всем привет! Нужен совет от опытных. Переношу свой проект с Делфи 10.2 Токио на Лазарус 3.2 установленный через инсталлятор fpcupdeluxe-x86_64-win64. При импортировании проект...
Дмитрий Завгородний
7
здравствуйте, братья, кто-нибудь знает, как работать с Swift.com или Swift.net?
Ozzy
6
Всем доброго дня! Подскажите может кто использовал связку Pagebuilder + Clientsetting. Сами параметры с типом pagebuilder в модуле Clientsetting работают нормально, можно такж...
Александр Добриков
12
Карта сайта