|
1 / 1 / 0
Регистрация: 28.08.2014
Сообщений: 93
|
||||||
Неоднозначность при наследовании21.11.2014, 20:41. Показов 3045. Ответов 7
Метки нет (Все метки)
Привет народ, думаю мой вопрос покажется вам чем-то из разряда "лучше бы делом занялся", но тех у кого останется терпение, прошу помочь мне преодолеть неоднозначность в данном коде:
а также в случае, когда метод в классе base виртуальный. Спасибо.
0
|
||||||
| 21.11.2014, 20:41 | |
|
Ответы с готовыми решениями:
7
Неоднозначность при множественном наследовании компилятор находит неоднозначность при вызове round(i) Использование шаблонов при наследовании, ошибка при компиляции |
|
Модератор
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
|
|||||||||||
| 21.11.2014, 21:29 | |||||||||||
0
|
|||||||||||
|
Вездепух
12942 / 6809 / 1821
Регистрация: 18.10.2014
Сообщений: 17,231
|
||||||||||||||||||
| 21.11.2014, 22:21 | ||||||||||||||||||
|
Т.е.
Неоднозначность в вызове 'ob.who();' можно разрешить либо приведением типа объекта (как показано выше), либо указанием квалифицированного имени метода в вызове
Можно также указать, какой именно метод вы предпочитаете при вызове через 'result' при помощи 'using'
Но это уже вопрос того, что вы хотите получить в результате. Т.е. хотите ли вы соединить эти линейки.
2
|
||||||||||||||||||
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
|
| 21.11.2014, 22:32 | |
|
zss, TheCalligrapher, Господа, а виртуальное наследование это слишком плохо? Али почему вы о нём не упомянули?
Спасибо
0
|
|
|
1 / 1 / 0
Регистрация: 28.08.2014
Сообщений: 93
|
||||||
| 21.11.2014, 22:51 [ТС] | ||||||
|
Спасибо, пол-проблемы уже решено, вот:
0
|
||||||
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
||||||
| 21.11.2014, 23:11 | ||||||
|
lenchis001, Использование виртуального наследования, позволяет нам выстроить однозначную последовательность наследования классов, т.е. класс base будет в единственном экземпляре, что даст нам возможность избавиться от
0
|
||||||
|
1 / 1 / 0
Регистрация: 28.08.2014
Сообщений: 93
|
||||||
| 21.11.2014, 23:33 [ТС] | ||||||
|
Хорошо, а почему тогда в этом коде:
0
|
||||||
|
Вездепух
12942 / 6809 / 1821
Регистрация: 18.10.2014
Сообщений: 17,231
|
||
| 22.11.2014, 00:36 | ||
Сообщение было отмечено lenchis001 как решение
РешениеДлинный ответ: 1. Когда база 'base' является невиртуальной, в вашей иерархии классов есть два корня: левый корень 'base' и правый корень 'base'. Из каждого такого корня вниз растут свои линейки (или даже подыерархии) классов-наследников, в которых как-то по своему перекрывается виртуальная функция 'who'. В один прекрасный момент эти две линейки (левая и правая) встречаются друг с другом в классе 'result'. Эти две линейки ничего не знают и не должны знать друг о друге. Левая линейка спокойно считает класс 'result' своим наследником, и правая линейка тоже спокойно считает класс 'result' своим наследником. Пришедшие в класс 'result' две линейки виртуальных функций 'who' тоже сосуществуют независимо, не мешая друг другу. C точки зрения каждой линейки у функции 'who' есть конкретный final overrider не всех уровнях иерархии, в том числе и в 'result'. Левая линейка считает, что для класса 'result' должна работать функция 'left2::who', а правая линейка считает, что для класса 'result' должна работать функция 'right1::who'. В этом не никакого конфликта. Какая версия 'who' будет работать в каждом конкретном вызове зависит от того, из какой линейки (левой или правой) пришел базовый подобъект 'base', использованный в вызове. 2. Но когда база 'base' становится виртуальной, картина сильно меняется. Теперь в иерархии есть только одна единственная база 'base', один-единственный корень из которого все растет. Из этого единственного корня растут две ветки - левая и правая - которые потом снова встречаются друг с другом в классе 'result'. Пришедшие к класс 'result' линейки перекрытых функций 'who' не являются независимыми - у них общий единственный корень 'base'. Это уже не две независимых линейки. Это одна единственная общая подыерархия. И рамках этой одной подыерархии класс 'result' не имеет однозначного final overrider для функции 'who'. Это ошибка. Компилятору надо знать конкретный final overrider для функции 'who' в классе 'result'. =================== Если опуститься на уровень реализации, то можно описать ситуацию так: 1. Когда база 'base' является невиртуальной, в классе 'result' есть два независимых подобъекта 'base', каждый из которых содержит свой указатель на таблицу виртуальных методов (VMT). Левый подобъект 'base' указывает на "левую" VMT, правый - на "правую" VMT. В каждой VMT содержится указатель на свой метод 'who'. Они друг другу никак не мешают. 2. Когда база 'base' является виртуальной, в классе 'result' есть только один подобъект 'base', который разумеется содержит только один указатель на VMT. Так как VMT только одна, компилятор должен знать, что же в нее вписать в качестве указателя на 'who'. Ваш код не дает однозначного ответа на это вопрос, поэтому и возникает ошибка. (Точнее, поэтому спецификация языка говорит, что такая ситуация ошибочна.)
2
|
||
| 22.11.2014, 00:36 | |
|
Помогаю со студенческими работами здесь
8
Ошибка при наследовании? Деструктор при наследовании Ошибка при наследовании С++ течет при наследовании
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|