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

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

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

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

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

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

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

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

124
692 / 383 / 51
Регистрация: 22.01.2009
Сообщений: 1,135
02.06.2009, 14:58 2
Да
0
159 / 156 / 47
Регистрация: 29.04.2009
Сообщений: 636
02.06.2009, 15:36 3
Да с тем же атрибутом и кол-вом параметров что и в базовом констукторе
+ еще можно добавить свои параметры в наследуемом.Например:
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
class book
{
protected:
char naz[20];
int kl;
public:
book(char*,int);
~book();
};
class avt:public book
{
char fm[10];
public:
avt(char*,int,char*)
~avt();
};
book::book(char *s,int i):kl(i)
{
//body
}
avt::avt(char*s,int i,char *s2):book(s,i)// наследование конструкторов
{
//body
}
int main()
{
avt av("Kniga 1",123,"avtor1")// вызов конструкторов классов book и avt
}
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
02.06.2009, 18:07 4
Неверно. Конструкторы и деструкторы не наследуются.
0
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
02.06.2009, 20:06 5
они не наследуются, но могут выполнятся..протестируй этот код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
class A
{
public:
   A() {cout << "Class A" << endl;}
};
 
class B: public A
{
public:
   B() {cout << "Class B" << endl;}
};
 
int main()
{
   B obj;
   return 0;
}
0
3 / 3 / 0
Регистрация: 09.01.2012
Сообщений: 28
06.12.2013, 20:43 6
Цитата Сообщение от CheshireCat Посмотреть сообщение
Неверно. Конструкторы и деструкторы не наследуются.
Не совсем так. Конструкторы не наследуются, так как не являются членами интерфейса класса, в некотором смысле (sic!) исключение составляет конструктор по умолчанию, который и был упомянут выше. В этом случае перед вызовом конструктора по умолчанию наследника вызывается конструктор по умолчанию родительского объекта для наследника. Однако конструктор с нетривиальным списком аргументов унаследован быть не может. Пример:

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

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
#include <iostream>
 
class A
{
    public:
        int v;
        A(int _v) :
        v(_v)
        {
        }
};
 
class B : public A
{
    public:
        B(int _v) : A(_v)
        {
 
        }
};
 
int main()
{
    B b(2);
    std::cout << b.v << "\n";
}
В этом случае определён конструктор наследника, который перед выполнением вызывает конструктор родителя. Получается цепочка, то есть, если у наследника есть ещё наследники (назовём их внуками), то во внуках достаточно будет сослаться на конструктор наследника, который позовёт конструктор родителя.

P.S. Вообще, даже в куда "более объектно-ориентированных" языках (C#, Java) проблема с наследованием конструкторов так же не решена, так что полагаться на введение наследования конструкторов в стандарт в обозримом будущем не стоит, ИМХО.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
06.12.2013, 20:50 7
Наследование функций - надо предложить такое, чтобы добавили в Стандарт C++17
1
gray_fox
06.12.2013, 20:53
  #8

Не по теме:

Не прошло и пяти лет...

0
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
06.12.2013, 21:58 9
xecu91, а директиву using почему не вспомнили?
Цитата Сообщение от xecu91 Посмотреть сообщение
Однако конструктор с нетривиальным списком аргументов унаследован быть не может
может. с помощью той же директивы.
class B : public A {
using A::A;
// . . .
}
0
3 / 3 / 0
Регистрация: 09.01.2012
Сообщений: 28
06.12.2013, 23:51 10
Цитата Сообщение от gromo Посмотреть сообщение
xecu91, а директиву using почему не вспомнили?
может. с помощью той же директивы.
class B : public A {
using A::A;
// . . .
}
1) using не работает с конструкторами
2) Даже если бы работал, всё равно это не наследование. Вся информация о наследовании - между двоеточием после имени класса и открывающей фигурной скобкой.
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
07.12.2013, 00:03 11
Цитата Сообщение от xecu91 Посмотреть сообщение
1) using не работает с конструкторами
Работает, поверь.
Цитата Сообщение от xecu91 Посмотреть сообщение
) Даже если бы работал, всё равно это не наследование.
Ну вообще это называется "inheriting constructors", так что хз...)
0
3 / 3 / 0
Регистрация: 09.01.2012
Сообщений: 28
07.12.2013, 01:04 12
Цитата Сообщение от gray_fox Посмотреть сообщение
Работает, поверь.

Ну вообще это называется "inheriting constructors", так что хз...)
не работает, проверь =)
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
07.12.2013, 01:09 13
Цитата Сообщение от xecu91 Посмотреть сообщение
не работает, проверь =)
http://ideone.com/iqBfOd
какие еще есть мнения?
0
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
07.12.2013, 01:29 14
Цитата Сообщение от xecu91 Посмотреть сообщение
1) using не работает с конструкторами
2) Даже если бы работал, всё равно это не наследование. Вся информация о наследовании - между двоеточием после имени класса и открывающей фигурной скобкой.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class A {
public:
    A() { cout << "A::A()\n"; }
    A(int, double) {cout << "A::A(int, double)\n";}
 
};
 
class B : public A {
public:
    //using A::A;
    B() { cout << "B::B()\n"; }
    B(int) { cout <<"B::B(int)\n"; }
};
 
int main
    B b(1, 1.0);
    return 0;
}
Запустите у себя этот код, потом раскомментируйте строку и запустите еще раз.
0
3 / 3 / 0
Регистрация: 09.01.2012
Сообщений: 28
07.12.2013, 01:33 15
Bash
1
2
3
g++ -std=c++0x a.cpp
a.cpp: At global scope:
a.cpp:10:14: ошибка: %<A::A» обозначает конструктор
Bash
1
2
g++ --version
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
0
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
07.12.2013, 01:34 16
xecu91, В GCC, кстати, если собирать без опции с++11, то выводится такое предупреждение:
Миниатюры
Наследуются ли конструкторы и деструкторы?  
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
07.12.2013, 01:35 17
xecu91, есть уже давно такая штука, которая называется C++11
0
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
07.12.2013, 01:42 18
Цитата Сообщение от xecu91 Посмотреть сообщение
g++ --version
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Староват
0
Croessmah
07.12.2013, 01:46
  #19

Не по теме:

Цитата Сообщение от gromo Посмотреть сообщение
Староват
если не ошибаюсь, то в репозитарии убунту только такой и есть. Но можно потратить немного времени и собрать себе поновее )))
пару дней назад поставил fedora 19, там в репозитарии сразу идет 4.8.2 :good:

0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
07.12.2013, 01:54 20
Да конструкторы наследуются и вызывается конструктор по умолчанию, но лучше явно вызывать в конструкторе производного класса.

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

Лучше ето все тести на практике: создавай классы, создавай в них деструкторы и перепроверяй, наследуется они или нет, это все легко проверяется.

Добавлено через 2 минуты
Ну как конструктор наследуется? Тут я выше неправильно сказал, он вызывается для базового класса и если не создано или не вызвано никакого конструктора то компилятор создает пустой умолчательный конструктор и вызывает его при вызове конструктора производного класса (при создании объекта производного класса).

Экспериментируй товарищ!!!!
0
07.12.2013, 01:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.12.2013, 01:54
Помогаю со студенческими работами здесь

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

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

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

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


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

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