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

Подскажите, а чем было обусловлено в С++ хранение таблицы виртуальных

функций в каждом объекте класса вместо хранения в качестве статичного поля класса?

19 ответов

12 просмотров

Где ты такое прочитал?

а что означает стат. поле?

Тем что это динамический полиморфизм

Потому что таблица виртуальных функций на каждый объект своя

Это не обусловлено, это не специфицировано

Но тебе нужно вычислить что это за реальный класс, как ты это со статиком сделаешь я хз

Хранится не таблица, а указатель на неё

Faberge-🇷🇺 Автор вопроса
Dmitriy [Отпуск]
Хранится не таблица, а указатель на неё

А если в таблице только одна функция?

Faberge-🇷🇺 Автор вопроса
Anton Kviatkovskii
Это не важно

Но это лишние переходы по памяти, нет?

Faberge 🇷🇺
Но это лишние переходы по памяти, нет?

Да нет, у тебя сама структура с указателями лежит рядом с классом

Faberge 🇷🇺
Но это лишние переходы по памяти, нет?

я как-то показывал реализацию динамического полиморфизма на С, может найдешь это интересным для себя, посмотришь как выглядят потроха https://gist.github.com/anatoly-spb/8fb267941b22d1d408f0f160fdc8a8d9#file-stream-h

Faberge-🇷🇺 Автор вопроса
Anatoly Shirokov
я как-то показывал реализацию динамического полимо...

Да я вот сам только недавно делал что-то похожее на Си, чтобы для себя разобраться

Faberge 🇷🇺
А как это тогда понимать?

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

Faberge 🇷🇺
Ну я так и написал

vptr все равно получается статическим полем

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

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

а через 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
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
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
Карта сайта