29 / 23 / 2
Регистрация: 14.04.2009
Сообщений: 448
|
|
1 | |
Наследуются ли конструкторы и деструкторы?02.06.2009, 14:54. Показов 24480. Ответов 124
Метки нет (Все метки)
0
|
02.06.2009, 14:54 | |
Ответы с готовыми решениями:
124
Наследуются ли конструкторы? Почему не наследуются конструкторы? Конструкторы и деструкторы Конструкторы и деструкторы |
20 / 20 / 0
Регистрация: 22.01.2012
Сообщений: 88
|
|
07.12.2013, 02:05 | 21 |
При открытом наследовании, открытые методи базового класса становяться открытыми методами производного класса, кроме конструкторов и деструкторов. Но их можно вызвать при использовании списков инициализаторов членов.
0
|
Croessmah
|
07.12.2013, 02:09
#22
|
1
|
20 / 20 / 0
Регистрация: 22.01.2012
Сообщений: 88
|
|
07.12.2013, 02:15 | 23 |
Нужно использовать виртуальный деструктор только тогда когда Вы собираетесь использовать указатели и ссылки на базовый класс, ссылаясь или указывая на производный класс, так как без виртуального деструктора, будет вызываться только деструктор для базового класса.
0
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
07.12.2013, 02:25 | 24 |
Нет это мелочь, много чего полезного почерпнул .
Добавлено через 1 минуту Да много полезного, но жаль оно не пригодиться, разработчиком классов я наврятли буду, а для потребителей классов там скажем так: "много лишнего материала".
0
|
Croessmah
|
07.12.2013, 02:28
#25
|
0
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
07.12.2013, 02:31 | 26 |
Увы для потребителей готовых классов более важны знания предметной области.
Добавлено через 2 минуты Да нехочу экспериментировать тем более мне щас оно нафиг не нужно, если понадобиться я создам два класса и посмотрю что вызывается и что нет и точьно тогда скажу, щас лень на практике все это делать. Я наверно там где то ошибся, на практике обычно все МЕЛКИЕ ошибки исправляются.
0
|
13.01.2016, 18:18 | 27 |
Так наследуются или нет? Лично я считаю, что только друзья не наследуются. Проверял опытным путем.
Почему в своей книге Страуструп (а также Стивен Прата) пишет, что они не наследуются, также как и оператор присваивания? Я считаю, что если объект производного класса может вызвать метод базового класса любым доступным способом, даже если он скрыт, то значит он был унаследован.
0
|
13.01.2016, 18:25 | 29 | |||||
0
|
3 / 3 / 0
Регистрация: 09.01.2012
Сообщений: 28
|
|
13.01.2016, 18:29 | 30 |
Ну и что, логично же ожидать, что конструктор при наследовании, если оно вдруг имеет место, должен остаться конструктором, с соответствующей семантикой. В этом примере совсем не так.
0
|
Неэпический
|
||||||
13.01.2016, 18:42 | 32 | |||||
0
|
3 / 3 / 0
Регистрация: 09.01.2012
Сообщений: 28
|
|||||||||||||||||||||
13.01.2016, 18:44 | 33 | ||||||||||||||||||||
Для начала нужно понять, о каком конструкторе идёт речь.
Компилятор может генерировать конструкторы автоматически, например, конструктор по умолчанию. Если он генерирует конструктор по умолчанию для производного класса, то он сам вставит вызов конструктора базового класса. Это можно легко увидеть, выполнив такой код:
Второй способ, который соответствует стандарту C++11:
0
|
13.01.2016, 19:20 | 34 |
Да, странно как-то это. Но в Visual Studio 2013 без ошибок компилируется (появляется только ошибка intellisense).
C++ Builder 6 не хочет компилить, багнутый, левую ошибку показывает. Но начинает компилить только, когда вручную определяешь конструктор по умолчанию A::A(). xecu91 То что у тебя вначале написано - это не из-за наследования. У каждого класса должны быть свои конструкторы. Если ни один не определён, то генерируется конструктор по умолчанию, в код которого добавляется неявный вызов конструктора по умолчанию базового класса. Но для конструктора по умолчания базового класса стоит модификатор explicit, который требует чтобы его вызывали явно. Поэтому и ошибка. И никак не из-за наследования. А то что в C++11 добавили так называемый constructor inheritance, то я бы эту возможность назвал так - constructor adoption (заимствование конструктора). И у меня почему-то код не компилится в VS 2013 (вместо конструктора A::A пытается вызвать копирующий конструктор B:B(const B&), но не может т.к. не может преобразовать int в B), хотя rextester компилит.
0
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
13.01.2016, 20:15 | 35 |
М-да, веселый язык С++! О каких бы самых базовых вещах ни зашла речь, внезапно выясняется, что никто о них не имеет адекватного представления!
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
13.01.2016, 20:45 | 36 |
наследуются.
не только конструкторы - весь класс, со всем своим барахлом. весь функционал, и все данные.
0
|
3 / 3 / 0
Регистрация: 09.01.2012
Сообщений: 28
|
|
13.01.2016, 21:25 | 37 |
kzru_hunter, это не так, попробуй убери оттуда explicit и скомпилируй.
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
13.01.2016, 21:48 | 38 |
Смотря у кого спрашивают:
- если у мидла: наследник наследует все методы и свойства родителя. - если у джуна: то не наследуются (конструктор, деструктор, оператор присваения и friend отношения)
0
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
|
14.01.2016, 01:05 | 39 |
Нет, не наследуются.
Они могут генерироваться компилятором, но не наследуются.
0
|
14.01.2016, 07:39 | 40 | |||||
Да, я там поторопился. Не обратил внимания на то, что там не был определен конструктор по умолчанию. И ошибся насчет explicit: генерируемый по умолчанию конструктор производного класса все-таки может неявно вызвать explicit конструктор по умолчанию базового класса.
В том то и проблема, что я не вижу между этими заключениями никакой связи. Я вижу только то, что в том коде был вручную пользователем определен кастомный конструктор в базовом классе, из-за чего компилятор не сгенерировал конструктор по умолчанию для этого базового класса. Поэтому компилятор и не может сгенерировать конструктор по умолчанию для производного класса, т.к. ему для этого нужен конструктор по умолчания базового класса, а он в свою очередь не был сгененерирован из-за причин, описанных выше. К сожалению, для меня это не означает, что конструкторы не наследуются. Как у вас получилось прийти к такому выводу - я не понимаю. почему не наследуются? Раз Страуструп говорит, что не наследуются, значит скорее всего так и есть. Но как я говорил, мне не даёт покоя следующее:
0
|
14.01.2016, 07:39 | |
14.01.2016, 07:39 | |
Помогаю со студенческими работами здесь
40
Конструкторы и деструкторы Конструкторы и деструкторы Конструкторы и деструкторы Конструкторы и деструкторы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |