29 / 23 / 2
Регистрация: 14.04.2009
Сообщений: 448
1

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

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

Author24 — интернет-сервис помощи студентам
При наследовании происходит ли наследование конструкторов и деструкторов базового класса?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2009, 14:54
Ответы с готовыми решениями:

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

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

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

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

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

Не по теме:

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

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

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

Не по теме:

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

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

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

Исчерпывающее объяснение здесь.
0
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,878
Записей в блоге: 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:
    
};
0
3 / 3 / 0
Регистрация: 09.01.2012
Сообщений: 28
13.01.2016, 18:29 30
Ну и что, логично же ожидать, что конструктор при наследовании, если оно вдруг имеет место, должен остаться конструктором, с соответствующей семантикой. В этом примере совсем не так.
0
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,878
Записей в блоге: 1
13.01.2016, 18:30 31
Цитата Сообщение от xecu91 Посмотреть сообщение
Исчерпывающее объяснение здесь.
Я там не увидел объяснения. Где именно? Я там только увидел ошибку в том, что ему нужно явно вызывать конструктор базового класса в конструкторе производного класса.
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 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
0
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.
0
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,878
Записей в блоге: 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 компилит.
0
Эксперт С++
3224 / 1751 / 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
Цитата Сообщение от CheshireCat Посмотреть сообщение
Неверно. Конструкторы и деструкторы не наследуются.
наследуются.
не только конструкторы - весь класс,
со всем своим барахлом.

весь функционал, и все данные.
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
Цитата Сообщение от kzru_hunter Посмотреть сообщение
Так наследуются или нет?
Нет, не наследуются.
Они могут генерироваться компилятором, но не наследуются.
0
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,878
Записей в блоге: 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()); // можно вызвать конструктор базового класса, но при этом будет создан объект базового класса, а не производного
Может дело в том, как понимать и видеть значение понятия наследования? Пытаюсь увидеть так, как видит Страуструп или Прата, но не получается.
0
14.01.2016, 07:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.01.2016, 07:39
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru