|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
Вызов виртуального метода в конструкторе07.10.2015, 18:20. Показов 5238. Ответов 12
Метки нет (Все метки)
Помню расматривался этот вопрос на форуме - хочу освежить память почему при вызове виртуального метода внутри конструктора UB
0
|
|
| 07.10.2015, 18:20 | |
|
Ответы с готовыми решениями:
12
Вызов виртуального метода при создании Вызов виртуального метода класса наследника из вектора Вызов виртуального метода базового класса из указателя производного |
|
202 / 138 / 88
Регистрация: 21.12.2014
Сообщений: 369
|
|
| 07.10.2015, 18:50 | |
|
Ссылка по теме: http://www.e-reading.club/chap... e_CPP.html
1
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 07.10.2015, 19:39 | ||
|
объект считается построенным тогда, когда полностью отрабатывает его конструктор. который включает в себя конструкторы базовых классов, и конструкторы членнов-данных. и пока конструктор ещё не отработал до конца, объект считается не построенным. а поскольку базовые конструкторы всегда вызываются первее, чем конструторы потомка, то имеем ситуацию: на момент работы контруктора, потомка ещё не существует. его конструктор ещё даже не начал запускаться. а поскольку нельзя запустить метод того, чего ещё не существует, то при вызове виртуальной функции-члена, происходит вызов функции-члена этого же класса, а не класса наследника. этот фактор создает иллюзию, что якобы на период действия конструктора, полиморфизм вообще не работает. на самом деле работает. просто наследника ещё не существует, и поэтому скрытый указатель на таблицу виртуальных фуункций настроен на базовый класс, а не на класс наследника.
1
|
||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||
| 07.10.2015, 19:49 [ТС] | ||
|
Или я путаю с чем-то ... (
0
|
||
|
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
|
|
| 07.10.2015, 19:53 | |
|
по-моему там работает простое правило: вируальный метод вызываемый в конструкторе трактуется как обычный (не виртуальный)
1
|
|
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|||||||||||
| 07.10.2015, 20:01 [ТС] | |||||||||||
|
При вызове деструктора
0
|
|||||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||
| 07.10.2015, 20:09 | |||||
Сообщение было отмечено rikimaru2013 как решение
Решениепотому что вызвать чисто-виртульную функцию без туловища - как нефиг нафиг. кстати, обратите внимание: первыми разрушаются потомки, потом предки. когда отрабатывает диструктор потомка, он перестает существовать. и указатель на vtbl модифицируется, указывая на ещё остающуюся в живых часть предка. соотвественно, на момент работы диструктора базового класса, в живых остается только сам базовый объект, и его предки. а вот потомков уже не существует. и как я уже писал выше - нельзя позвать то, чего не существует.
1
|
|||||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||||
| 07.10.2015, 20:11 [ТС] | ||||
0
|
||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 07.10.2015, 20:24 | |
|
0
|
|
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|||||||
| 07.10.2015, 20:30 [ТС] | |||||||
0
|
|||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 07.10.2015, 20:36 | |
|
0
|
|
|
Комп_Оратор)
|
|
| 07.10.2015, 20:58 | |
|
0
|
|
| 07.10.2015, 20:58 | |
|
Помогаю со студенческими работами здесь
13
Переопределение виртуального метода Реализация виртуального метода в двух классах-наследниках Автоматический вызов функций в конструкторе Почему при переопределении виртуального метода в производном классе выводится метод базового? Преобразование типа при вызове виртуального метода через указатель на базовый класс Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|