Форум программистов, компьютерный форум 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
FunDuck
688 / 379 / 4
Регистрация: 22.01.2009
Сообщений: 1,135
02.06.2009, 14:58     Наследуются ли конструкторы и деструкторы? #2
Да
Sekt
 Аватар для Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
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
}
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
02.06.2009, 18:07     Наследуются ли конструкторы и деструкторы? #4
Неверно. Конструкторы и деструкторы не наследуются.
Monte-Cristo
 Аватар для Monte-Cristo
2805 / 1370 / 30
Регистрация: 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;
}
xecu91
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) проблема с наследованием конструкторов так же не решена, так что полагаться на введение наследования конструкторов в стандарт в обозримом будущем не стоит, ИМХО.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
06.12.2013, 20:50     Наследуются ли конструкторы и деструкторы? #7
Наследование функций - надо предложить такое, чтобы добавили в Стандарт C++17
gray_fox
06.12.2013, 20:53
  #8

Не по теме:

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

gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
06.12.2013, 21:58     Наследуются ли конструкторы и деструкторы? #9
xecu91, а директиву using почему не вспомнили?
Цитата Сообщение от xecu91 Посмотреть сообщение
Однако конструктор с нетривиальным списком аргументов унаследован быть не может
может. с помощью той же директивы.
class B : public A {
using A::A;
// . . .
}
xecu91
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) Даже если бы работал, всё равно это не наследование. Вся информация о наследовании - между двоеточием после имени класса и открывающей фигурной скобкой.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
07.12.2013, 00:03     Наследуются ли конструкторы и деструкторы? #11
Цитата Сообщение от xecu91 Посмотреть сообщение
1) using не работает с конструкторами
Работает, поверь.
Цитата Сообщение от xecu91 Посмотреть сообщение
) Даже если бы работал, всё равно это не наследование.
Ну вообще это называется "inheriting constructors", так что хз...)
xecu91
3 / 3 / 0
Регистрация: 09.01.2012
Сообщений: 28
07.12.2013, 01:04     Наследуются ли конструкторы и деструкторы? #12
Цитата Сообщение от gray_fox Посмотреть сообщение
Работает, поверь.

Ну вообще это называется "inheriting constructors", так что хз...)
не работает, проверь =)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
07.12.2013, 01:09     Наследуются ли конструкторы и деструкторы? #13
Цитата Сообщение от xecu91 Посмотреть сообщение
не работает, проверь =)
http://ideone.com/iqBfOd
какие еще есть мнения?
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
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;
}
Запустите у себя этот код, потом раскомментируйте строку и запустите еще раз.
xecu91
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
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
07.12.2013, 01:34     Наследуются ли конструкторы и деструкторы? #16
xecu91, В GCC, кстати, если собирать без опции с++11, то выводится такое предупреждение:
Миниатюры
Наследуются ли конструкторы и деструкторы?  
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
07.12.2013, 01:35     Наследуются ли конструкторы и деструкторы? #17
xecu91, есть уже давно такая штука, которая называется C++11
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
07.12.2013, 01:42     Наследуются ли конструкторы и деструкторы? #18
Цитата Сообщение от xecu91 Посмотреть сообщение
g++ --version
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Староват
Croessmah
07.12.2013, 01:46
  #19

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2013, 01:54     Наследуются ли конструкторы и деструкторы?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
07.12.2013, 01:54     Наследуются ли конструкторы и деструкторы? #20
Да конструкторы наследуются и вызывается конструктор по умолчанию, но лучше явно вызывать в конструкторе производного класса.

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

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

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

Экспериментируй товарищ!!!!
Yandex
Объявления
07.12.2013, 01:54     Наследуются ли конструкторы и деструкторы?
Ответ Создать тему
Опции темы

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