Форум программистов, компьютерный форум 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Limb0
 Аватар для Limb0
19 / 19 / 0
Регистрация: 22.01.2012
Сообщений: 88
07.12.2013, 02:05     Наследуются ли конструкторы и деструкторы? #21
При открытом наследовании, открытые методи базового класса становяться открытыми методами производного класса, кроме конструкторов и деструкторов. Но их можно вызвать при использовании списков инициализаторов членов.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
07.12.2013, 02:09
  #22

Не по теме:

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

Limb0
 Аватар для Limb0
19 / 19 / 0
Регистрация: 22.01.2012
Сообщений: 88
07.12.2013, 02:15     Наследуются ли конструкторы и деструкторы? #23
Цитата Сообщение от ninja2 Посмотреть сообщение
Деструктор от вроде не помню нужно виртуальный создавать обязательно что б при уничтожении производного класса обязательно вызывался для базового иначе, если не создать, то для базового класса он не вызовется.
Нужно использовать виртуальный деструктор только тогда когда Вы собираетесь использовать указатели и ссылки на базовый класс, ссылаясь или указывая на производный класс, так как без виртуального деструктора, будет вызываться только деструктор для базового класса.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
07.12.2013, 02:25     Наследуются ли конструкторы и деструкторы? #24
Цитата Сообщение от Croessmah Посмотреть сообщение
всё, чему Вас научил Страуструп?
Нет это мелочь, много чего полезного почерпнул .

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

Не по теме:

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

ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
07.12.2013, 02:31     Наследуются ли конструкторы и деструкторы? #26
Увы для потребителей готовых классов более важны знания предметной области.

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

Исчерпывающее объяснение здесь.
kzru_hunter
 Аватар для kzru_hunter
1084 / 759 / 58
Регистрация: 01.02.2011
Сообщений: 1,771
Записей в блоге: 1
13.01.2016, 18:25     Наследуются ли конструкторы и деструкторы? #29
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:
    
};
xecu91
3 / 3 / 0
Регистрация: 09.01.2012
Сообщений: 28
13.01.2016, 18:29     Наследуются ли конструкторы и деструкторы? #30
Ну и что, логично же ожидать, что конструктор при наследовании, если оно вдруг имеет место, должен остаться конструктором, с соответствующей семантикой. В этом примере совсем не так.
kzru_hunter
 Аватар для kzru_hunter
1084 / 759 / 58
Регистрация: 01.02.2011
Сообщений: 1,771
Записей в блоге: 1
13.01.2016, 18:30     Наследуются ли конструкторы и деструкторы? #31
Цитата Сообщение от xecu91 Посмотреть сообщение
Исчерпывающее объяснение здесь.
Я там не увидел объяснения. Где именно? Я там только увидел ошибку в том, что ему нужно явно вызывать конструктор базового класса в конструкторе производного класса.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
13.01.2016, 18:42     Наследуются ли конструкторы и деструкторы? #32
Цитата Сообщение от 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
xecu91
3 / 3 / 0
Регистрация: 09.01.2012
Сообщений: 28
13.01.2016, 18:44     Наследуются ли конструкторы и деструкторы? #33
Для начала нужно понять, о каком конструкторе идёт речь.

Компилятор может генерировать конструкторы автоматически, например, конструктор по умолчанию. Если он генерирует конструктор по умолчанию для производного класса, то он сам вставит вызов конструктора базового класса. Это можно легко увидеть, выполнив такой код:
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.
kzru_hunter
 Аватар для kzru_hunter
1084 / 759 / 58
Регистрация: 01.02.2011
Сообщений: 1,771
Записей в блоге: 1
13.01.2016, 19:20     Наследуются ли конструкторы и деструкторы? #34
Цитата Сообщение от 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 компилит.
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,651
13.01.2016, 20:15     Наследуются ли конструкторы и деструкторы? #35
М-да, веселый язык С++! О каких бы самых базовых вещах ни зашла речь, внезапно выясняется, что никто о них не имеет адекватного представления!
hoggy
5114 / 2115 / 403
Регистрация: 15.11.2014
Сообщений: 4,800
Завершенные тесты: 1
13.01.2016, 20:45     Наследуются ли конструкторы и деструкторы? #36
Цитата Сообщение от CheshireCat Посмотреть сообщение
Неверно. Конструкторы и деструкторы не наследуются.
наследуются.
не только конструкторы - весь класс,
со всем своим барахлом.

весь функционал, и все данные.
xecu91
3 / 3 / 0
Регистрация: 09.01.2012
Сообщений: 28
13.01.2016, 21:25     Наследуются ли конструкторы и деструкторы? #37
kzru_hunter, это не так, попробуй убери оттуда explicit и скомпилируй.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2133 / 966 / 222
Регистрация: 30.11.2013
Сообщений: 3,224
13.01.2016, 21:48     Наследуются ли конструкторы и деструкторы? #38
Смотря у кого спрашивают:
- если у мидла: наследник наследует все методы и свойства родителя.
- если у джуна: то не наследуются (конструктор, деструктор, оператор присваения и friend отношения)
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
14.01.2016, 01:05     Наследуются ли конструкторы и деструкторы? #39
Цитата Сообщение от kzru_hunter Посмотреть сообщение
Так наследуются или нет?
Нет, не наследуются.
Они могут генерироваться компилятором, но не наследуются.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2016, 07:39     Наследуются ли конструкторы и деструкторы?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
kzru_hunter
 Аватар для kzru_hunter
1084 / 759 / 58
Регистрация: 01.02.2011
Сообщений: 1,771
Записей в блоге: 1
14.01.2016, 07:39     Наследуются ли конструкторы и деструкторы? #40
Цитата Сообщение от 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()); // можно вызвать конструктор базового класса, но при этом будет создан объект базового класса, а не производного
Может дело в том, как понимать и видеть значение понятия наследования? Пытаюсь увидеть так, как видит Страуструп или Прата, но не получается.
Yandex
Объявления
14.01.2016, 07:39     Наследуются ли конструкторы и деструкторы?
Ответ Создать тему
Опции темы

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