|
9 / 9 / 0
Регистрация: 22.01.2012
Сообщений: 59
|
|||||||||||
Почему не наследуются конструкторы?17.02.2015, 15:37. Показов 3351. Ответов 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 собирает проект, а приложение говорит что мои конструкторы не конструкторы
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут
Суть:
- Группа наркоманов из 10 человек.
- Только один инфицирован ВИЧ.
- Колются одной иглой.
- Колются раз в день.
- Колются последовательно через. . .
|
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
|
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
|
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . .
а удачный момент так и не приходит.
|
|
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица.
Задача: зафиксировать три левых колонки в отчете.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
/ / . . .
|
Настройки VS Code
Loafer 13.04.2026
{
"cmake. configureOnOpen": false,
"diffEditor. ignoreTrimWhitespace": true,
"editor. guides. bracketPairs": "active",
"extensions. ignoreRecommendations": true,
. . .
|
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2.
Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива.
Было так:. . .
|
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: реализовать контроль корректности заполнения дат назначения. . .
|