Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 55, средняя оценка - 4.93
rar14
28 / 22 / 1
Регистрация: 14.04.2009
Сообщений: 448
#1

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

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

При наследовании происходит ли наследование конструкторов и деструкторов базового класса?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
FunDuck
688 / 379 / 4
Регистрация: 22.01.2009
Сообщений: 1,135
02.06.2009, 14:58     Наследуются ли конструкторы и деструкторы? #2
Да
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
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,364
02.06.2009, 18:07     Наследуются ли конструкторы и деструкторы? #4
Неверно. Конструкторы и деструкторы не наследуются.
Monte-Cristo
2788 / 1374 / 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
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
06.12.2013, 20:50     Наследуются ли конструкторы и деструкторы? #7
Наследование функций - надо предложить такое, чтобы добавили в Стандарт C++17
gray_fox
06.12.2013, 20:53
  #8

Не по теме:

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

gromo
370 / 269 / 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!
1446 / 1175 / 61
Регистрация: 21.04.2012
Сообщений: 2,463
Завершенные тесты: 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
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
07.12.2013, 01:09     Наследуются ли конструкторы и деструкторы? #13
Цитата Сообщение от xecu91 Посмотреть сообщение
не работает, проверь =)
http://ideone.com/iqBfOd
какие еще есть мнения?
gromo
370 / 269 / 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;
}
Запустите у себя этот код, потом раскомментируйте строку и запустите еще раз.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2013, 01:33     Наследуются ли конструкторы и деструкторы?
Еще ссылки по теме:
Конструкторы и деструкторы C++
C++ Конструкторы/Деструкторы
Конструкторы и деструкторы C++
C++ Конструкторы и деструкторы
C++ Конструкторы и деструкторы

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

Или воспользуйтесь поиском по форуму:
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
Yandex
Объявления
07.12.2013, 01:33     Наследуются ли конструкторы и деструкторы?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru