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

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

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

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

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

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

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

124
 Аватар для Limb0
20 / 20 / 0
Регистрация: 22.01.2012
Сообщений: 88
07.12.2013, 02:05
Студворк — интернет-сервис помощи студентам
При открытом наследовании, открытые методи базового класса становяться открытыми методами производного класса, кроме конструкторов и деструкторов. Но их можно вызвать при использовании списков инициализаторов членов.
0
07.12.2013, 02:09

Не по теме:

Цитата Сообщение от ninja2 Посмотреть сообщение
Советую Страуструпа почитать "Язык С++", я до сих пор под впечатлением от нее, более информативной книги я еще не встречал.
Цитата Сообщение от ninja2 Посмотреть сообщение
Я пока С++ учил за полтора года 2 игры консольные сделал - солитер и реверси, и мелких там крестики нолики, покер и еще мельче там угадай число. По мимо этого свой компилятор бейсика делал и щас уже парсер 1.2к строк кода написал и дальше дописываю, плюс целую кучу задач перебрал. Это и есть опыт. Я учу полтора года С++ и можно сказать что полтора года опыта есть.
Цитата Сообщение от ninja2 Посмотреть сообщение
Я честно не нарадуюсь книге, чото я думаю другие книги после нее смысла нету читать, наверно нового ничего не дадут.
и это
Цитата Сообщение от ninja2 Посмотреть сообщение
Деструктор от вроде не помню нужно виртуальный создавать обязательно что б при уничтожении производного класса обязательно вызывался для базового иначе, если не создать, то для базового класса он не вызовется.
всё, чему Вас научил Страуструп? :scratch:

1
 Аватар для Limb0
20 / 20 / 0
Регистрация: 22.01.2012
Сообщений: 88
07.12.2013, 02:15
Цитата Сообщение от ninja2 Посмотреть сообщение
Деструктор от вроде не помню нужно виртуальный создавать обязательно что б при уничтожении производного класса обязательно вызывался для базового иначе, если не создать, то для базового класса он не вызовется.
Нужно использовать виртуальный деструктор только тогда когда Вы собираетесь использовать указатели и ссылки на базовый класс, ссылаясь или указывая на производный класс, так как без виртуального деструктора, будет вызываться только деструктор для базового класса.
0
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
07.12.2013, 02:25
Цитата Сообщение от Croessmah Посмотреть сообщение
всё, чему Вас научил Страуструп?
Нет это мелочь, много чего полезного почерпнул .

Добавлено через 1 минуту
Да много полезного, но жаль оно не пригодиться, разработчиком классов я наврятли буду, а для потребителей классов там скажем так: "много лишнего материала".
0
07.12.2013, 02:28

Не по теме:

Цитата Сообщение от ninja2 Посмотреть сообщение
Нет это мелочь, много чего полезного почерпнул
да мы так и поняли. Внимание, найдите отличие и скажите чья цитата правильная:
Цитата Сообщение от ninja2 Посмотреть сообщение
если не создать, то для базового класса он не вызовется.
Цитата Сообщение от Limb0 Посмотреть сообщение
так как без виртуального деструктора, будет вызываться только деструктор для базового класса.
бедный Страуструп, писал, писал, а толку 0

0
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
07.12.2013, 02:31
Увы для потребителей готовых классов более важны знания предметной области.

Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
да мы так и поняли. Внимание, найдите отличие и скажите чья цитата правильная:
Да нехочу экспериментировать тем более мне щас оно нафиг не нужно, если понадобиться я создам два класса и посмотрю что вызывается и что нет и точьно тогда скажу, щас лень на практике все это делать.
Я наверно там где то ошибся, на практике обычно все МЕЛКИЕ ошибки исправляются.
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
13.01.2016, 18:18
Так наследуются или нет? Лично я считаю, что только друзья не наследуются. Проверял опытным путем.
Почему в своей книге Страуструп (а также Стивен Прата) пишет, что они не наследуются, также как и оператор присваивания?
Я считаю, что если объект производного класса может вызвать метод базового класса любым доступным способом, даже если он скрыт, то значит он был унаследован.
0
3 / 3 / 0
Регистрация: 09.01.2012
Сообщений: 28
13.01.2016, 18:21
Если вкратце - нет, конструкторы не наследуются.

Исчерпывающее объяснение здесь.
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
13.01.2016, 18:25
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class A
{
public:
 
};
 
class B : public A
{
public:
    void func()
    {
        A::A(); // этот конструктор можно вызвать, несмотря на то, что так нельзя делать
        //C::C(); этот конструктор нельзя вызвать
    }
};
 
class C : public A
{
public:
    
};
0
3 / 3 / 0
Регистрация: 09.01.2012
Сообщений: 28
13.01.2016, 18:29
Ну и что, логично же ожидать, что конструктор при наследовании, если оно вдруг имеет место, должен остаться конструктором, с соответствующей семантикой. В этом примере совсем не так.
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
13.01.2016, 18:30
Цитата Сообщение от xecu91 Посмотреть сообщение
Исчерпывающее объяснение здесь.
Я там не увидел объяснения. Где именно? Я там только увидел ошибку в том, что ему нужно явно вызывать конструктор базового класса в конструкторе производного класса.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
13.01.2016, 18:42
Цитата Сообщение от kzru_hunter Посмотреть сообщение
// этот конструктор можно вызвать, несмотря на то, что так нельзя делать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
 
class A
{
public:
 
};
 
class B : public A
{
public:
    void func()
    {
       A::A(); // этот конструктор можно вызвать, несмотря на то, что так нельзя делать
       //C::C(); этот конструктор нельзя вызвать
    }
};
 
class C : public A
{
public:
    
};
 
int main()
{
    std::cout << "Hello, world!\n";
}
http://rextester.com/KKWLK56056
0
3 / 3 / 0
Регистрация: 09.01.2012
Сообщений: 28
13.01.2016, 18:44
Для начала нужно понять, о каком конструкторе идёт речь.

Компилятор может генерировать конструкторы автоматически, например, конструктор по умолчанию. Если он генерирует конструктор по умолчанию для производного класса, то он сам вставит вызов конструктора базового класса. Это можно легко увидеть, выполнив такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
class A {
 public:
    A() {
        std::cout << "A::A()\n";
    }
};
 
class B : public A {
};
 
int main() {
    B b;
    return 0;
}
Если же речь идёт о конструкторе, который не генерируется компилятором автоматически, то вызов конструкторов базового класса - ответственность программиста. Например, следующий код не будет скомпилирован:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
class A {
 public:
    explicit A(int v) {
        std::cout << "A::A(" << v << ")\n";
    }
};
 
class B : public A {
};
 
int main() {
    B b(2);
    return 0;
}
Это и означает, что конструкторы не наследуются. Однако, для достижения некоторого "наследования" конструкторов есть два способа. Первый, соответствующий стандарту C++03:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
class A {
 public:
    explicit A(int v) {
        std::cout << "A::A(" << v << ")\n";
    }
};
 
class B : public A {
 public:
    B(int v) : A(v) {
    }
};
 
int main() {
    B b(2);
    return 0;
}
Здесь мы явно вызываем конструктор базового класса в списке инициализации производного класса.

Второй способ, который соответствует стандарту C++11:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
class A {
 public:
    explicit A(int v) {
        std::cout << "A::A(" << v << ")\n";
    }
};
 
class B : public A {
 public:
    using A::A;
};
 
int main() {
    B b(2);
    return 0;
}
Здесь мы явно говорим, что необходимо унаследовать конструкторы базового класса A.
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
13.01.2016, 19:20
Цитата Сообщение от Croessmah Посмотреть сообщение
http://rextester.com/KKWLK56056
Да, странно как-то это. Но в 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
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
13.01.2016, 20:15
М-да, веселый язык С++! О каких бы самых базовых вещах ни зашла речь, внезапно выясняется, что никто о них не имеет адекватного представления!
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
13.01.2016, 20:45
Цитата Сообщение от CheshireCat Посмотреть сообщение
Неверно. Конструкторы и деструкторы не наследуются.
наследуются.
не только конструкторы - весь класс,
со всем своим барахлом.

весь функционал, и все данные.
0
3 / 3 / 0
Регистрация: 09.01.2012
Сообщений: 28
13.01.2016, 21:25
kzru_hunter, это не так, попробуй убери оттуда explicit и скомпилируй.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
13.01.2016, 21:48
Смотря у кого спрашивают:
- если у мидла: наследник наследует все методы и свойства родителя.
- если у джуна: то не наследуются (конструктор, деструктор, оператор присваения и friend отношения)
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
14.01.2016, 01:05
Цитата Сообщение от kzru_hunter Посмотреть сообщение
Так наследуются или нет?
Нет, не наследуются.
Они могут генерироваться компилятором, но не наследуются.
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
14.01.2016, 07:39
Цитата Сообщение от xecu91 Посмотреть сообщение
это не так, попробуй убери оттуда explicit и скомпилируй.
Да, я там поторопился. Не обратил внимания на то, что там не был определен конструктор по умолчанию. И ошибся насчет explicit: генерируемый по умолчанию конструктор производного класса все-таки может неявно вызвать explicit конструктор по умолчанию базового класса.

Цитата Сообщение от xecu91 Посмотреть сообщение
Если же речь идёт о конструкторе, который не генерируется компилятором автоматически, то вызов конструкторов базового класса - ответственность программиста. Например, следующий код не будет скомпилирован:
....
Это и означает, что конструкторы не наследуются.
В том то и проблема, что я не вижу между этими заключениями никакой связи. Я вижу только то, что в том коде был вручную пользователем определен кастомный конструктор в базовом классе, из-за чего компилятор не сгенерировал конструктор по умолчанию для этого базового класса. Поэтому компилятор и не может сгенерировать конструктор по умолчанию для производного класса, т.к. ему для этого нужен конструктор по умолчания базового класса, а он в свою очередь не был сгененерирован из-за причин, описанных выше. К сожалению, для меня это не означает, что конструкторы не наследуются. Как у вас получилось прийти к такому выводу - я не понимаю.

Цитата Сообщение от mporro Посмотреть сообщение
Они могут генерироваться компилятором, но не наследуются.
почему не наследуются?

Раз Страуструп говорит, что не наследуются, значит скорее всего так и есть.
Но как я говорил, мне не даёт покоя следующее:
C++
1
2
3
4
5
6
7
8
B b;
B h;    
b.A::operator=(h); // можно вызвать оператор присваивания базового класса
 
// можно ещё использовать в производном классе using A::operator=
// и тогда можно просто использовать b = h; <- вызовется A::operator=
 
B *j = (B*)(new B::A()); // можно вызвать конструктор базового класса, но при этом будет создан объект базового класса, а не производного
Может дело в том, как понимать и видеть значение понятия наследования? Пытаюсь увидеть так, как видит Страуструп или Прата, но не получается.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.01.2016, 07:39

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
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 и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru