Форум программистов, компьютерный форум CyberForum.ru

Наследуются ли конструкторы и деструкторы? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 55, средняя оценка - 4.93
rar14
28 / 22 / 1
Регистрация: 14.04.2009
Сообщений: 448
02.06.2009, 14:54     Наследуются ли конструкторы и деструкторы? #1
При наследовании происходит ли наследование конструкторов и деструкторов базового класса?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2009, 14:54     Наследуются ли конструкторы и деструкторы?
Посмотрите здесь:

C++ Конструкторы/Деструкторы
C++ Конструкторы и деструкторы
C++ Конструкторы и деструкторы
Конструкторы и деструкторы C++
Почему не наследуются конструкторы? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
14.01.2016, 09:14     Наследуются ли конструкторы и деструкторы? #41
kzru_hunter
В С++ наследование делает одновременно два дела: подтип наследует типовую метку супертипа и устанавливает между выведенным классом и базовым классом отношение композиции. Словно бы в В Вы определили поле типа A и разместили там какой-то объект. Это приводит к ужасающей путанице между наследованием и композицией. В частности, C++ позволяет "унаследовать" класс закрытым образом! Это приводит к тому, что два класса входят в отношение композиции, но не в ходят в отношение наследования вообще, а называется эта операция "закрытым наследованием". Также и с конструкторами: они не наследуются, наследовать их было бы крайне глупо, но они агрегируются.

Добавлено через 14 минут
kzru_hunter
Есть ещё такой терминологический изыск: наследование интерфейса и наследование реализации. В этом смысле можно говорить, что интерфейс базовых конструкторов не наследуется, а реализация -- да.

Можно развести дискуссию и на такую тему, что обсуждение наследования конструктора бессмысленно, как деление ноль, так как нельзя сказать, что объект обрабатывает сообщение о своём конструировании, ведь он вообще не создан!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
14.01.2016, 09:53     Наследуются ли конструкторы и деструкторы? #42
Цитата Сообщение от kzru_hunter Посмотреть сообщение
В том то и проблема, что я не вижу между этими заключениями никакой связи.
потому что её там нет.
товарищ несет пургу.

Добавлено через 24 минуты
Цитата Сообщение от kzru_hunter Посмотреть сообщение
Может дело в том, как понимать и видеть значение понятия наследования?
возможно одно и только одно понимание, которое не будет противоречить самому себе:
класс А унаследовал от класса Б все

получаем некий Д, который представляет собой плоскую модель [A:Б]
то бишь все от А, и все от Б.

доказательство непротиворечивости:

люди грамотные, и балбесы сходяццо в одном:
наследуются фукнкции-члены, и члены-данные классов.

в частности мы можем позвать функцию член Б, через имя класса А:

C++
1
2
3
4
5
int main(){
    struct B { void foo(){} };
    struct A: B {};
    A a a.foo();
}
теперь вносим функцию-член в приваты:

C++
1
2
3
4
5
int main(){
    class B { void foo(){} };
    struct A: B {};
    A a a.foo(); // error: private
}
внимание вопрос: наследуется ли функция-член foo?
если балбес скажет: нет,
тогда он и начнет противоречить самому себе.

функция-член наследуется.
она просто не доступна в контексте класса наследника.

технически, наследование - это тупо объединение двух (или более) классов в один.

результатом синтеза А и Б является некий Д,
который включает в себя все функции-члены и данные от обоих классов.
при этом все члены обоих классов сосуществуют одновременно.

C++
1
2
3
4
5
6
// данная модель иллюстрирует принцип наследования
template<class T> struct derrived: T {};
struct base {};
 
typedef derrived<base>
    agregat;
агрегат - продукт синтеза (наследования).
плоская модель, которая обладает всем функционалом обоих классов
но при этом не является ни derrived, ни base


все что нужно понять балбесам,
коих в этой теме как минимум несколько:
вопрос не в том, наследуется ли (да, наследуется).
вопрос: а доступен ли?

доступность тех или иных членов классов
определяется правилами языка.

но не техническими ограничениями.

с технической точки зрения любой функционал базового класса,
будь то функция-член, или конструктор
(который, с технической точки зрения так же является функцией)
реально существует.
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,691
14.01.2016, 10:26     Наследуются ли конструкторы и деструкторы? #43
Цитата Сообщение от mporro Посмотреть сообщение
Также и с конструкторами: они не наследуются, наследовать их было бы крайне глупо, но они агрегируются.
Ну, Страуструп мастер засирать мозги, и его терминология очень противоречива. Изначально наследование означает наследование свойств, однако при закрытом наследовании классов этого не происходит.
Наследование функции, это когда несколько классов разного типа имеют одну и ту же функцию. Но конструкторы классов разных типов по определению имеют разные имена, как же два разных типа могут иметь один и тот же конструктор?
Так что холивар заложен самим автором языка в его противоречивой терминологии.
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
14.01.2016, 10:30     Наследуются ли конструкторы и деструкторы? #44
hoggy
Опять у фас какие-то фантазии начинаются, на почве С++

Согласно вашим фантазиям ниже идёт наследование...
C++
1
2
3
4
5
6
7
8
struct TBase {
    void foo();
};
 
struct TDerived {
    TBase b;
    void baz();
};
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,691
14.01.2016, 10:33     Наследуются ли конструкторы и деструкторы? #45
Цитата Сообщение от mporro Посмотреть сообщение
Можно развести дискуссию и на такую тему, что обсуждение наследования конструктора бессмысленно, как деление ноль, так как нельзя сказать, что объект обрабатывает сообщение о своём конструировании, ведь он вообще не создан!
Ну, конструктор инициализирует уже созданный объект, поэтому его можно рассматривать как сообщение "сырому" объекту.
Кстати, здесь у Страуструпа тоже терминологический ляп, так как конструктором он назвал то, что фактически является инициализатором.
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
14.01.2016, 10:47     Наследуются ли конструкторы и деструкторы? #46
Mr.X
Цитата Сообщение от Mr.X Посмотреть сообщение
холивар заложен самим автором языка в его противоречивой терминологии
Термины хороши и удобны для языков высокого уровня, когда есть возможность чётко представить терминологические абстракции прямо в языке. Мне, например, Haskell показался в этом смысле удачным языком.

А вот С++ -- крайне неудачный. Язык, в сущности, низкого уровня. Здесь уже о терминах говорить сложнее, потому что люди упорно цепляются за конкретные реализации терминологических абстракций. Отбросить полностью реализации тоже не получается -- это важная часть С++. Вот и холивары. А Страуструп, собственно, и ни при чём. Он ясно везде даёт понять: есть абстракция -- это вот так, наша реализация -- вот так.
Operok
126 / 124 / 33
Регистрация: 15.02.2015
Сообщений: 386
Завершенные тесты: 2
14.01.2016, 10:51     Наследуются ли конструкторы и деструкторы? #47
Поведение конструкторов и деструкторов при наследовании в отличие от методов больше напоминают инкапсуляцию (объекта базового класса в производный, именно объекта, а не указателя), что и не мудрено, ведь базовый класс целиком включается в производный и предоставляет ему свой интерфейс (опустим подробности).
Допустим у нас есть дерево (вырожденное в список) классов "1...N", теперь мы хотим создать объект класса "N" (вызываем его конструктор). Начинает разворачиваться рекурсия: конструктор "N" вызывает (прежде чем сам выполнится) конструктор N-1 (если явно не указывать, какой, то "по умолчанию"), этот в свою очередь - конструктор N-2 и т.д. При инкапсуляции, конструктор инициализирует свои данные, вызывая "конструкторы по умолчанию" или иные, при явном указании. С деструктором похожая ситуация. При уничтожении объекта класса "N", сначала выполняется тело его деструктора, затем деструктор "N-1" и т.д. В случае с полиморфизмом и виртуальными деструкторами компилятор не знает, объект какого класса надо удалять, поэтому "программа" смотрит в таблицу виртуальных методов, находит там деструктор некого класса "N-M" (M < N) и вызывает его, а тот все остальные до "самого базового" класса.
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
14.01.2016, 11:24     Наследуются ли конструкторы и деструкторы? #48
Цитата Сообщение от Mr.X Посмотреть сообщение
уже созданный объект
А что значит "созданный объект"?
Ведь объекту до инициализации нельзя отправить никакого другого сообщения, кроме инициализации...

Я бы эти стадии расположил в таком порядке, чтобы конструктор шёл более низким порядком, чем инициализация.

Инициализация (не может сделать даже сам объект) --> копирование (инициализация нового объекта данными уже существующего, только на уровне самого объекта можно сделать) --> конструирование (т.е. преобразование кортежа входных аргументов в инициализатор объекта -- это может кто угодно).

Добавлено через 28 минут
Mr.X
На мой взгляд, человек грамотно пишет про то, что конструкторы должны быть тонкими. Т.е. то, что мы в своих классах называем конструкторами, то и есть не более, чем инициализаторы. А настоящие конструкторы -- это wrappers & decorators, которые выражают естественные преобразования, втягивающие входящие параметры в категорию, описываемую нашим поведенческим типом.
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,691
14.01.2016, 12:10     Наследуются ли конструкторы и деструкторы? #49
Цитата Сообщение от mporro Посмотреть сообщение
А Страуструп, собственно, и ни при чём.
Как раз таки при чем. Его определения противоречивы, а по законам логики из противоречия может следовать все что угодно, в том числе и вот такие бессмысленные и беспощадные холивары.

Добавлено через 14 минут
Цитата Сообщение от mporro Посмотреть сообщение
А что значит "созданный объект"?
Ну, объект - это именованная область памяти. Созданный (но еще не проинициализированный) объект - это участок сырой памяти, выделенный в компьютере, с присвоенным ему именем. Грубо говоря, создание объекта - это именование отрезка сырой памяти.

Добавлено через 13 минут
Цитата Сообщение от mporro Посмотреть сообщение
потому что люди упорно цепляются за конкретные реализации терминологических абстракций
Ну, это как раз те, которые не умеют мыслить абстрактно. Забавно бывает наблюдать, как люди демонстрируют какие-либо свойства стандарта, приводя примеры работы какого-нибудь компилятора. По логике, чтобы это делать, они должны сначала доказать соответствие этого компилятора стандарту...
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
14.01.2016, 12:14     Наследуются ли конструкторы и деструкторы? #50
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, объект - это именованная область памяти. Созданный (но еще не проинициализированный) объект - это участок сырой памяти, выделенный в компьютере, с присвоенным ему именем. Грубо говоря, создание объекта - это именование отрезка сырой памяти.
Я бы немного перефразировал для полноты
Объект - зарезервированная область в памяти. Создание объекта - резервирование памяти. У памяти нет имени, есть только адрес.
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
14.01.2016, 12:20     Наследуются ли конструкторы и деструкторы? #51
Цитата Сообщение от Mr.X Посмотреть сообщение
Его определения противоречивы
Я не буду спорить, хотя мне помнится, что Страуструп достаточно чётко и непротиворечиво формулирует мысли.

Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, объект - это именованная область памяти.
Из такого взгляда на объект получается, что расчищенная площадка -- это уже дом. о.О Объект, всё же, должен обладать своей идентичностью. Я очень сомневаюсь, хотя и не исключаю, что Страуструп называет объектом область памяти.
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,691
14.01.2016, 12:20     Наследуются ли конструкторы и деструкторы? #52
Цитата Сообщение от Kastaneda Посмотреть сообщение
Объект - зарезервированная область в памяти. Создание объекта - резервирование памяти. У памяти нет имени, есть только адрес
Не согласен. В программе есть имя. В компьютере есть участок памяти. Объект - это то, что их связывает.
Создание объекта - это установление связи между именем в программе и отрезком памяти в компьютере.
Fallenworld
75 / 75 / 9
Регистрация: 14.04.2014
Сообщений: 408
14.01.2016, 12:22     Наследуются ли конструкторы и деструкторы? #53
3 страницы споров длинной в 6 лет... Только вот я не понимаю о чем тут спорить. Конструктор предназначен для конструирования обьектов одного конкрентного класса и только его. Наследники - это уже другие классы с другими обьектами и у них есть свой конструктор, который вызывает конструктор по умолчанию базового класса, если явно не указаны аргументы типа Derived(int i):Base(i){}
Спорить то не о чём
А да.
Обьект - это не область памяти. такое определение слишком низкоуровневое, его можно применить разве что к массиву или структуре в стиле С. Обьект размещается на области в памяти, при своем создании. Но ведет себя совсем не как область в памяти.
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
14.01.2016, 12:26     Наследуются ли конструкторы и деструкторы? #54
Mr.X
Опять же... Если вернуться к абстракции Карделли, то объект -- это что-то, замыкающее обработку сообщений. Попытка получить какое-то значение для замыкания вызова из неинициализированной памяти может привести к чему угодно. С точки зрения низкоуровневой реализации объект выражается областью памяти, но абстракция объекта -- нечто большее, чем память.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
14.01.2016, 12:32     Наследуются ли конструкторы и деструкторы? #55
Цитата Сообщение от Fallenworld Посмотреть сообщение
Но ведет себя совсем не как область в памяти
А как он себя ведет? В С++ я в объект (в участок памяти, занимаемую объектом) того же STL вектора могу текстовый файл записать. Это просто кусок памяти.

Цитата Сообщение от mporro Посмотреть сообщение
С точки зрения низкоуровневой реализации объект выражается областью памяти, но абстракция объекта -- нечто большее, чем память.
Вот почему 3 страницы холивара , у всех разные ракурсы. Я в своей жизни больше с низким уровнем работал, поэтому смотрю на все под этим углом. Если смотреть совсем абстрактно, то объект - это сущность, обрабатывающая сообщения (или как там у классиков).
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
14.01.2016, 12:38     Наследуются ли конструкторы и деструкторы? #56
Прежде чем спорить о том, наследуются ли конструкторы/деструкторы, надо бы поспорить по поводу того, когда конструктор/деструктор можно назвать унаследованным
В контексте C++:
Members of a base class other than constructors are said to be inherited by the derived class. Constructors of a base class can also be inherited as described in 7.3.3. Inherited members can be referred to in expressions in the same manner as other members of the derived class, unless their names are hidden or ambiguous (10.2).
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,691
14.01.2016, 12:38     Наследуются ли конструкторы и деструкторы? #57
Цитата Сообщение от Fallenworld Посмотреть сообщение
Обьект размещается на области в памяти, при своем создании. Но ведет себя совсем не как область в памяти.
Цитата Сообщение от mporro Посмотреть сообщение
но абстракция объекта -- нечто большее, чем память.
Ну, вы недопоняли мое определение. Объект - это именованная область памяти, а имя в программе имеет тип.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
14.01.2016, 12:48     Наследуются ли конструкторы и деструкторы? #58
Цитата Сообщение от ct0r Посмотреть сообщение
Constructors of a base class can also be inherited as described in 7.3.3.
Что там в 7.3.3, интрига прям

Добавлено через 1 минуту
Вот кстати ответ на спор про то, что прайват поля не наследуются
Цитата Сообщение от ct0r Посмотреть сообщение
Inherited members can be referred to in expressions in the same manner as other members of the derived class, unless their names are hidden or ambiguous
Они наследуются, но недоступны.
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
14.01.2016, 13:18     Наследуются ли конструкторы и деструкторы? #59
ct0r
Стандарт относится не только к тем, кто языком пользуется, но и к тем, кто создаёт компиляторы, причём к последним в большей степени. Inheretence с точки зрения стандарта -- это может быть всё, что угодно комитету. Если мы разбираем вопрос: агрегируются ли конструкторы? Мы открываем стандарт и видим, что агрегируется всё и называется (в стандрате!) наследованием. Но это слово не имеет никакого отношения к ООП. Это как в юр. договоре: "ООО<Си и Плюс-Плюс>, именуемое далее поставщик..." Но это вовсе не означает, что в русском языке "поставщик" -- это ООО<Си и Плюс-Плюс>.

С точки зрения абстракции наследования, конструкторы С++ не наследуются, они только агрегируются.


Цитата Сообщение от Mr.X Посмотреть сообщение
имя в программе имеет тип
Вот в том-то и дело!
Если я напишу
C++
1
int *a = (int*)malloc(10*sizeof(int));
Я могу только о том говорить, что был создан кусок памяти. Но я не могу утверждать, что этот кусок -- целое число, там вполне может оказаться trapped representation. Без инициализации нельзя назвать область памяти объектом в том смысле, в котором мы понимаем его, упоминая объектно-ориентированное программирования.

Добавлено через 10 минут
Цитата Сообщение от Kastaneda Посмотреть сообщение
поэтому смотрю на все под этим углом
А я и не предлагаю смотреть на вещи под каким-то одним углом. Но опасно выдавать частность за абстракцию.
Вот в С++ наследование реализовано прямой агрегацией. И когда начинают выдавать агрегацию за наследование, то мы получаем персонал, который наследует машину от колеса...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2016, 14:40     Наследуются ли конструкторы и деструкторы?
Еще ссылки по теме:

Конструкторы и деструкторы C++
C++ Конструкторы и деструкторы
Конструкторы и деструкторы C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
kzru_hunter
 Аватар для kzru_hunter
1084 / 759 / 58
Регистрация: 01.02.2011
Сообщений: 1,771
Записей в блоге: 1
14.01.2016, 14:40     Наследуются ли конструкторы и деструкторы? #60
Я запутался, не знаю, кому верить. Если рассуждать, что конструкторы не наследуются, то получается, что и методы, которые были переопределены в производном классе, не наследуются (но об этом везде молчок):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class A
{
public:
        void func(int a, int b) {}
};
 
class B : public A 
{
public:
        void func() {}
};
 
int main() 
{
    B b;
    b.func(4,4); // ошибка: функция не принимает 2 аргументов
    b.func(); // ок
        
    return 0;
}
Что вообще понимается под выражением: конструкторы, деструкторы и т.д. не наследуются?
Yandex
Объявления
14.01.2016, 14:40     Наследуются ли конструкторы и деструкторы?
Ответ Создать тему
Опции темы

Текущее время: 18:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru