Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.81/124: Рейтинг темы: голосов - 124, средняя оценка - 4.81
29 / 23 / 2
Регистрация: 14.04.2009
Сообщений: 448

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

02.06.2009, 14:54. Показов 30594. Ответов 124
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При наследовании происходит ли наследование конструкторов и деструкторов базового класса?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.06.2009, 14:54
Ответы с готовыми решениями:

Наследуются ли конструкторы?
Привет. Хочу спросить, если базовый класс имеет открытый конструктор по умолчанию, то при открытом наследовании будет ли создан...

Почему не наследуются конструкторы?
Здравствуйте. Гугл говорит, что конструкторы в C++ унаследовать никак нельзя. Почему так? В чём проблема с их наследованием? Хотел...

Конструкторы и деструкторы
Создать класс LongLong для работы с целыми числами из 64 бит. Число должно быть представлено двумя полями: long — старшая часть, unsigned...

124
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
14.01.2016, 09:14
Студворк — интернет-сервис помощи студентам
kzru_hunter
В С++ наследование делает одновременно два дела: подтип наследует типовую метку супертипа и устанавливает между выведенным классом и базовым классом отношение композиции. Словно бы в В Вы определили поле типа A и разместили там какой-то объект. Это приводит к ужасающей путанице между наследованием и композицией. В частности, C++ позволяет "унаследовать" класс закрытым образом! Это приводит к тому, что два класса входят в отношение композиции, но не в ходят в отношение наследования вообще, а называется эта операция "закрытым наследованием". Также и с конструкторами: они не наследуются, наследовать их было бы крайне глупо, но они агрегируются.

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

Можно развести дискуссию и на такую тему, что обсуждение наследования конструктора бессмысленно, как деление ноль, так как нельзя сказать, что объект обрабатывает сообщение о своём конструировании, ведь он вообще не создан!
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.01.2016, 09:53
Цитата Сообщение от 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


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

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

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

с технической точки зрения любой функционал базового класса,
будь то функция-член, или конструктор
(который, с технической точки зрения так же является функцией)
реально существует.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
14.01.2016, 10:26
Цитата Сообщение от mporro Посмотреть сообщение
Также и с конструкторами: они не наследуются, наследовать их было бы крайне глупо, но они агрегируются.
Ну, Страуструп мастер засирать мозги, и его терминология очень противоречива. Изначально наследование означает наследование свойств, однако при закрытом наследовании классов этого не происходит.
Наследование функции, это когда несколько классов разного типа имеют одну и ту же функцию. Но конструкторы классов разных типов по определению имеют разные имена, как же два разных типа могут иметь один и тот же конструктор?
Так что холивар заложен самим автором языка в его противоречивой терминологии.
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
14.01.2016, 10:30
hoggy
Опять у фас какие-то фантазии начинаются, на почве С++

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

А вот С++ -- крайне неудачный. Язык, в сущности, низкого уровня. Здесь уже о терминах говорить сложнее, потому что люди упорно цепляются за конкретные реализации терминологических абстракций. Отбросить полностью реализации тоже не получается -- это важная часть С++. Вот и холивары. А Страуструп, собственно, и ни при чём. Он ясно везде даёт понять: есть абстракция -- это вот так, наша реализация -- вот так.
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
14.01.2016, 10:51
Поведение конструкторов и деструкторов при наследовании в отличие от методов больше напоминают инкапсуляцию (объекта базового класса в производный, именно объекта, а не указателя), что и не мудрено, ведь базовый класс целиком включается в производный и предоставляет ему свой интерфейс (опустим подробности).
Допустим у нас есть дерево (вырожденное в список) классов "1...N", теперь мы хотим создать объект класса "N" (вызываем его конструктор). Начинает разворачиваться рекурсия: конструктор "N" вызывает (прежде чем сам выполнится) конструктор N-1 (если явно не указывать, какой, то "по умолчанию"), этот в свою очередь - конструктор N-2 и т.д. При инкапсуляции, конструктор инициализирует свои данные, вызывая "конструкторы по умолчанию" или иные, при явном указании. С деструктором похожая ситуация. При уничтожении объекта класса "N", сначала выполняется тело его деструктора, затем деструктор "N-1" и т.д. В случае с полиморфизмом и виртуальными деструкторами компилятор не знает, объект какого класса надо удалять, поэтому "программа" смотрит в таблицу виртуальных методов, находит там деструктор некого класса "N-M" (M < N) и вызывает его, а тот все остальные до "самого базового" класса.
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
14.01.2016, 11:24
Цитата Сообщение от Mr.X Посмотреть сообщение
уже созданный объект
А что значит "созданный объект"?
Ведь объекту до инициализации нельзя отправить никакого другого сообщения, кроме инициализации...

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

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

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

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

Добавлено через 13 минут
Цитата Сообщение от mporro Посмотреть сообщение
потому что люди упорно цепляются за конкретные реализации терминологических абстракций
Ну, это как раз те, которые не умеют мыслить абстрактно. Забавно бывает наблюдать, как люди демонстрируют какие-либо свойства стандарта, приводя примеры работы какого-нибудь компилятора. По логике, чтобы это делать, они должны сначала доказать соответствие этого компилятора стандарту...
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
14.01.2016, 12:14
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, объект - это именованная область памяти. Созданный (но еще не проинициализированный) объект - это участок сырой памяти, выделенный в компьютере, с присвоенным ему именем. Грубо говоря, создание объекта - это именование отрезка сырой памяти.
Я бы немного перефразировал для полноты
Объект - зарезервированная область в памяти. Создание объекта - резервирование памяти. У памяти нет имени, есть только адрес.
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
14.01.2016, 12:20
Цитата Сообщение от Mr.X Посмотреть сообщение
Его определения противоречивы
Я не буду спорить, хотя мне помнится, что Страуструп достаточно чётко и непротиворечиво формулирует мысли.

Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, объект - это именованная область памяти.
Из такого взгляда на объект получается, что расчищенная площадка -- это уже дом. о.О Объект, всё же, должен обладать своей идентичностью. Я очень сомневаюсь, хотя и не исключаю, что Страуструп называет объектом область памяти.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
14.01.2016, 12:20
Цитата Сообщение от Kastaneda Посмотреть сообщение
Объект - зарезервированная область в памяти. Создание объекта - резервирование памяти. У памяти нет имени, есть только адрес
Не согласен. В программе есть имя. В компьютере есть участок памяти. Объект - это то, что их связывает.
Создание объекта - это установление связи между именем в программе и отрезком памяти в компьютере.
0
76 / 76 / 32
Регистрация: 14.04.2014
Сообщений: 408
14.01.2016, 12:22
3 страницы споров длинной в 6 лет... Только вот я не понимаю о чем тут спорить. Конструктор предназначен для конструирования обьектов одного конкрентного класса и только его. Наследники - это уже другие классы с другими обьектами и у них есть свой конструктор, который вызывает конструктор по умолчанию базового класса, если явно не указаны аргументы типа Derived(int i):Base(i){}
Спорить то не о чём
А да.
Обьект - это не область памяти. такое определение слишком низкоуровневое, его можно применить разве что к массиву или структуре в стиле С. Обьект размещается на области в памяти, при своем создании. Но ведет себя совсем не как область в памяти.
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
14.01.2016, 12:26
Mr.X
Опять же... Если вернуться к абстракции Карделли, то объект -- это что-то, замыкающее обработку сообщений. Попытка получить какое-то значение для замыкания вызова из неинициализированной памяти может привести к чему угодно. С точки зрения низкоуровневой реализации объект выражается областью памяти, но абстракция объекта -- нечто большее, чем память.
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
14.01.2016, 12:32
Цитата Сообщение от Fallenworld Посмотреть сообщение
Но ведет себя совсем не как область в памяти
А как он себя ведет? В С++ я в объект (в участок памяти, занимаемую объектом) того же STL вектора могу текстовый файл записать. Это просто кусок памяти.

Цитата Сообщение от mporro Посмотреть сообщение
С точки зрения низкоуровневой реализации объект выражается областью памяти, но абстракция объекта -- нечто большее, чем память.
Вот почему 3 страницы холивара , у всех разные ракурсы. Я в своей жизни больше с низким уровнем работал, поэтому смотрю на все под этим углом. Если смотреть совсем абстрактно, то объект - это сущность, обрабатывающая сообщения (или как там у классиков).
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
14.01.2016, 12:38
Прежде чем спорить о том, наследуются ли конструкторы/деструкторы, надо бы поспорить по поводу того, когда конструктор/деструктор можно назвать унаследованным
В контексте 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).
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
14.01.2016, 12:38
Цитата Сообщение от Fallenworld Посмотреть сообщение
Обьект размещается на области в памяти, при своем создании. Но ведет себя совсем не как область в памяти.
Цитата Сообщение от mporro Посмотреть сообщение
но абстракция объекта -- нечто большее, чем память.
Ну, вы недопоняли мое определение. Объект - это именованная область памяти, а имя в программе имеет тип.
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
14.01.2016, 12:48
Цитата Сообщение от 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
Они наследуются, но недоступны.
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
14.01.2016, 13:18
ct0r
Стандарт относится не только к тем, кто языком пользуется, но и к тем, кто создаёт компиляторы, причём к последним в большей степени. Inheretence с точки зрения стандарта -- это может быть всё, что угодно комитету. Если мы разбираем вопрос: агрегируются ли конструкторы? Мы открываем стандарт и видим, что агрегируется всё и называется (в стандрате!) наследованием. Но это слово не имеет никакого отношения к ООП. Это как в юр. договоре: "ООО<Си и Плюс-Плюс>, именуемое далее поставщик..." Но это вовсе не означает, что в русском языке "поставщик" -- это ООО<Си и Плюс-Плюс>.

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


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

Добавлено через 10 минут
Цитата Сообщение от Kastaneda Посмотреть сообщение
поэтому смотрю на все под этим углом
А я и не предлагаю смотреть на вещи под каким-то одним углом. Но опасно выдавать частность за абстракцию.
Вот в С++ наследование реализовано прямой агрегацией. И когда начинают выдавать агрегацию за наследование, то мы получаем персонал, который наследует машину от колеса...
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
14.01.2016, 14:40
Я запутался, не знаю, кому верить. Если рассуждать, что конструкторы не наследуются, то получается, что и методы, которые были переопределены в производном классе, не наследуются (но об этом везде молчок):
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;
}
Что вообще понимается под выражением: конструкторы, деструкторы и т.д. не наследуются?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.01.2016, 14:40

Конструкторы и деструкторы
Прочитал про конструкторы и деструкторы. Пишут что они нужны для инициализации переменных класса. Как они используются я понял, но не понял...

Конструкторы и деструкторы
Здравствуйте уважаемые программисты, помогите пожалуйста новичку? Не могу разобраться в программе, где смог там написал комментарий и то не...

Конструкторы и деструкторы
Здравствуйте!Помогите пожалуйста с решением данной задачи, Буду премного благодарен за оказанную помощь :), а то я совсем:-| ...

Конструкторы и деструкторы
Привет. Есть структура, содержащая 7 полей, в которые я ввожу значения с клавиатуры. Нужно используя конструкторы и деструкторы...

Конструкторы и деструкторы
#include &lt;iostream&gt; #include &lt;Windows.h&gt; class Try { public: void* px; Try() { printf(&quot;Try\n&quot;); px=malloc(12); }; ...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru