|
9 / 9 / 0
Регистрация: 22.01.2012
Сообщений: 59
|
|||||||||||
Почему не наследуются конструкторы?17.02.2015, 15:37. Показов 3267. Ответов 30
Метки нет (Все метки)
Здравствуйте. Гугл говорит, что конструкторы в C++ унаследовать никак нельзя. Почему так? В чём проблема с их наследованием?
Хотел написать вектор, у которого operator [] переопределён на at()
0
|
|||||||||||
| 17.02.2015, 15:37 | |
|
Ответы с готовыми решениями:
30
Наследуются ли конструкторы? Наследуются ли конструкторы и деструкторы? Почему не наследуются переменные ? |
|
Неэпический
|
|||||||
| 17.02.2015, 15:45 | |||||||
2
|
|||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
| 17.02.2015, 15:45 | ||||||
1
|
||||||
|
Неэпический
|
||
| 17.02.2015, 15:48 | ||
|
Ну вот есть в наследнике конструктор с определенным параметром и в базовом есть - конфликт. Не хочу я наследовать конструкторы(чаще так и бывает), тогда нужно все конструкторы базового класса прятать куда-то, тоже не тру. А при множественном наследовании как быть? А с конструктором копий?
0
|
||
|
9 / 9 / 0
Регистрация: 22.01.2012
Сообщений: 59
|
|
| 17.02.2015, 15:51 [ТС] | |
|
Croessmah, Как и с обычными методами. Если два одинаковых конструктора, в приорете тот, который у наследника.
При множественном наследовании проблем не вижу.
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 17.02.2015, 15:58 | |||||||
|
http://rextester.com/NUNQFZ68981
1
|
|||||||
|
9 / 9 / 0
Регистрация: 22.01.2012
Сообщений: 59
|
||||||
| 17.02.2015, 15:59 [ТС] | ||||||
|
Croessmah, ваш код у меня не компилируется
![]() (mingw-32, -std=C++11)
0
|
||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 17.02.2015, 16:01 | ||
|
что б слегка поменять логику отдельного метода наследоваться приватно не обязательно. И что б вы знали: для передачи количества или индексов массивов используют беззнаковый size_t.
1
|
||
|
9 / 9 / 0
Регистрация: 22.01.2012
Сообщений: 59
|
|||
| 17.02.2015, 16:38 [ТС] | |||
|
Добавлено через 1 минуту hoggy, И всё-таки на mingw не компилируется. Как у меня, так и в онлайн-компиляторе (http://www.onlinecompiler.net/) ![]() Добавлено через 15 минут hoggy, а ещё я вовсе не понимаю, что это за строчка такая
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||||||||||||
| 17.02.2015, 17:34 | |||||||||||||||||||||||
Сообщение было отмечено Андрей Xomach как решение
Решениеа так же онлайн сервису на который вы ссылаетесь, обновить компилятор. свежий компилятор gcc, который идет в коробке mingw поддерживает с++11 http://ideone.com/DMBDmm ------------------------------------------------------------------------ 2. Либо использовать более "старую" технику основанную на variardic template. Например, так это можно реализовать для компилятора cl (вижуал студия), который плохо поддерживает с++11 http://rextester.com/MNLCQ86757
-- избежать копирования аргументов -- аргументы могут быть как lvalue, так и rvalue std::forward нужен, для оптимизации запуска конструктора. Благодаря ему становится возможным запуск move-конструктора ------------------------------------------------------------------------ 3. Если ваш компилятор слишком стар и вообще не поддерживает с++11, то можно реализовать это так, как это делалось в рамках с++03:
В рамках с++03 стратегия оптимальной передачи аргументов - предмет особых плясков с бубнами. В данном сообщении я этот нюанс рассматривать не буду, поскольку полагаю с++03 в 2015 году не очень актуален. Добавлено через 15 минут Ключевое слово using сообщает компилятору, что указанная сущность должна быть видима в текущем пространстве имен. В контексте классов, это позволяет контролировать модификаторы доступа к унаследованному функционалу. Пример: http://rextester.com/TEKK89627
Что бы открыть доступ: просто перечислить методы базового класса в публичной зоне. Что бы закрыть доступ: просто перечислить методы базового класса в частной зоне. Что бы защитить доступ: просто перечислить методы базового класса в защищенной зоне.
1
|
|||||||||||||||||||||||
|
9 / 9 / 0
Регистрация: 22.01.2012
Сообщений: 59
|
|
| 17.02.2015, 17:59 [ТС] | |
|
hoggy, огромное вам спасибо, вспомнил и узнал много нового.
Вот только в реализации для C++03 не лучше бы использовать const A1 & чтобы аргумент мог быть rvalue?
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||
| 17.02.2015, 18:16 | ||||||||||||
|
Проблема оптимальной стратегии передачи аргументов в с++03 это "легаси-косяк-в-дизайне-языка". Рассмотрим пример: http://rextester.com/KMOTF77045
Для константного аргумента шаблон раскроется в const T& А для не константного аргумента раскроется в T& Поэтому, это будет работать в обоих случаях. Но есть проблема:
что компилятор считает, что литерные числовые константы имеют тип данных, который не является const Циферку 100 он попытался передать через T&, а не через const T& На самом деле, циферка 100 - это rvalue, которое само по себе не является const. Однако, поскольку в рамках с++03 пользователи не могут работать с rvalue явным образом, то попытка сделать универсально превращается в аццкие пляски с бубнами. Любое решение оказывается не тривиальным. В простейшем случае (когда всего 1 аргумент) достаточно посадить рядышком ещё один конструктор, у которого аргумент явный const T& Но если аргументов может быть много, и некоторые из них должны раскрываться, как T&, а другие - как const T&, то начинается увлекательное путешествие в мир граблей языка с++
1
|
||||||||||||
|
28 / 28 / 5
Регистрация: 23.04.2014
Сообщений: 130
|
|||||||||||
| 17.02.2015, 23:31 | |||||||||||
|
Конструктор предка и так содержится в в наследнике, при вызове конструктора наследника по цепочке вызываются все конструкторы предков. Поэтому нет смысла его копировать.
Например, есть класс
Добавлено через 6 минут Не успел откорректировать сообщение) В этом коде видно, что можно вызывать явно конструктор предка. Т.е. сначала вызывается конструктор наследника, затем конструктор предка, и так далее по цепочке. С деструктором та же ситуация, при его вызове по той же самой цепочке, но в обратном порядке вызываются все деструкторы предков. Поэтому деструктор всегда должен иметь определение, даже если он чисто виртуальный
0
|
|||||||||||
|
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
|
| 18.02.2015, 10:53 | |
|
0
|
|
|
Неэпический
|
|||
| 18.02.2015, 12:17 | |||
|
0
|
|||
| 18.02.2015, 13:03 | |
|
Не по теме: Croessmah, да я скорее про последовательность, да естественно в начале вызывается конструктор наследника(мы же наследника создаем), но завершается создание объекта конструктором наследника(точнее инициализацией его полей), а конструкторы базовых вызываются с головы
0
|
|
|
28 / 28 / 5
Регистрация: 23.04.2014
Сообщений: 130
|
|
| 18.02.2015, 14:20 | |
|
0
|
|
| 18.02.2015, 14:33 | |
|
0
|
|
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|||||||
| 18.02.2015, 15:19 | |||||||
0
|
|||||||
| 18.02.2015, 15:19 | |
|
Помогаю со студенческими работами здесь
20
Конструкторы. Почему-то по умолчанию и копирующий не срабатывают, помогите найти ошибку.
Почему в описании языка "интерфейсы наследуются"? Webpack собирает проект, а приложение говорит что мои конструкторы не конструкторы
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|