Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

При наследовании происходит ли наследование конструкторов и деструкторов базового класса?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2009, 14:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследуются ли конструкторы и деструкторы? (C++):

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

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

Конструкторы и деструкторы - C++
Помогите, пожалуйста, исправить программу и закончить ее как надо. Необходимо реализовать класс с двумя полями, имеющими имена first и...

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

Конструкторы и деструкторы - C++
Не понимаю, как закончить программу. Написала конструктор и деструктор, хотя он тут и не нужен по идее. Но по заданию сделала. А как...

Конструкторы и деструкторы - C++
Необходимо реализовать класс с двумя полями, имеющими имена first и second. Обязательно должны присутствовать: Для инициализации...

124
FunDuck
688 / 379 / 4
Регистрация: 22.01.2009
Сообщений: 1,135
02.06.2009, 14:58 #2
Да
0
Sekt
157 / 156 / 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
}
0
CheshireCat
Эксперт С++
2899 / 1248 / 78
Регистрация: 27.05.2008
Сообщений: 3,414
02.06.2009, 18:07 #4
Неверно. Конструкторы и деструкторы не наследуются.
0
Monte-Cristo
2794 / 1380 / 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;
}
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) проблема с наследованием конструкторов так же не решена, так что полагаться на введение наследования конструкторов в стандарт в обозримом будущем не стоит, ИМХО.
0
Croessmah
Пришел
Эксперт CЭксперт С++
13764 / 7845 / 894
Регистрация: 27.09.2012
Сообщений: 19,259
Записей в блоге: 3
Завершенные тесты: 1
06.12.2013, 20:50 #7
Наследование функций - надо предложить такое, чтобы добавили в Стандарт C++17
1
gray_fox
06.12.2013, 20:53
  #8

Не по теме:

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

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

Ну вообще это называется "inheriting constructors", так что хз...)
не работает, проверь =)
0
Croessmah
Пришел
Эксперт CЭксперт С++
13764 / 7845 / 894
Регистрация: 27.09.2012
Сообщений: 19,259
Записей в блоге: 3
Завершенные тесты: 1
07.12.2013, 01:09 #13
Цитата Сообщение от xecu91 Посмотреть сообщение
не работает, проверь =)
http://ideone.com/iqBfOd
какие еще есть мнения?
0
gromo
372 / 271 / 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;
}
Запустите у себя этот код, потом раскомментируйте строку и запустите еще раз.
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
0
07.12.2013, 01:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2013, 01:33
Привет! Вот еще темы с ответами:

Конструкторы и деструкторы - C++
Код: #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include &lt;conio.h&gt; class complex { private: double im; double...

Конструкторы и деструкторы - C++
Помогите исправить программу. Необходимо реализовать класс с двумя полями, имеющими имена first и second. Обязательно должны...

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

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


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

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

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