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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.80
Hagrael
БТР - мой друг
331 / 273 / 2
Регистрация: 07.01.2010
Сообщений: 1,932
#1

Наследование конструкторов - C++

12.06.2012, 15:24. Просмотров 4272. Ответов 11
Метки нет (Все метки)

Здравствуйте! У меня такой вопрос: Как сделать так, чтобы при создании объекта дочернего класса не вызывался конструктор родительского? При таком коде вызывается и тот, и тот конструкторы:
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>
using namespace std;
 
class parent {
    public:
        int a;
        parent () {
            a = 5;
        }
};
 
class child : public parent {
    public:
        int b;
        child () {
            b = 10;
            a = 1;
        }
};
 
int main () {
    child obj;
    cout << obj.a << " " << obj.b;
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2012, 15:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование конструкторов (C++):

Наследование конструкторов - C++
Вопрос по теории наследования: Есть некоторый базовый класс с двумя конструкторами типа паблик, первый без аргумента, второй с одним...

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

Наследование конструкторов - C++
Здрасти. Такая проблема. У меня есть классы с таким наследованием: KIERUNEK--&gt;PRZEDMIOT--&gt;OCENA&lt;--STUDENT Вот конструкторы класса...

Наследование конструкторов - C++
Здравствуйте, мне нужно что бы player наследовал конструктор от aobject class aobject { public: aobject(int xx,int yy,int** mm)...

Наследование конструкторов - C++
Добрый день. Подскажите как правильно осуществить наследование конструктора в двух файлах h и cpp. В одном h файле все работало. ...

Наследование конструкторов - C++
Создать класс CPoint – точка. На его основе создать классы CColoredPoint и CLine. На основе класса СLine создать класс CcoloredLine и класс...

11
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.06.2012, 15:36 #2
Цитата Сообщение от Hagrael Посмотреть сообщение
Как сделать так, чтобы при создании объекта дочернего класса не вызывался конструктор родительского?
никак ты это не сделаешь ибо это противоречит наследованию
0
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
12.06.2012, 16:00 #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
#include <iostream>
 
class parent {
public:
    parent (): a(5) {}
    int A() const {return a;}
protected:
    int a;
    parent(int val): a(val) {}
};
 
class child : public parent {
public:
    child (): parent(1), b(10) {}
    int B() const {return b;}
private:
    int b;
};
 
int main () {
    child obj;
    std::cout << obj.A() << " " << obj.B();
    return 0;
}
1
Hagrael
БТР - мой друг
331 / 273 / 2
Регистрация: 07.01.2010
Сообщений: 1,932
13.06.2012, 07:03  [ТС] #4
А что означают вот эти записи?
C++
1
parent (): a(5) {}
C++
1
child (): parent(1), b(10) {}
Я никогда раньше не видел такого описания функций
В учебнике написано, что если ты не создаешь конструктор в потомке, то будет вызван родительский конструктор, после чего все переменные потомка обнулятся. Но что если я написал свой конструктор для потомка? Выходит, в этом случае родительский конструктор тоже вызывается?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
13.06.2012, 13:14 #5
Hagrael, Вызывается очевидно. Читайте про список инициализации.
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.06.2012, 14:52 #6
Цитата Сообщение от Hagrael Посмотреть сообщение
В учебнике написано, что если ты не создаешь конструктор в потомке, то будет вызван родительский конструктор
Конструктор родителя всегда будет вызван

Цитата Сообщение от Hagrael Посмотреть сообщение
после чего все переменные потомка обнулятся.
Конструктор будет вызван только для не POD типов

Цитата Сообщение от Hagrael Посмотреть сообщение
Но что если я написал свой конструктор для потомка? Выходит, в этом случае родительский конструктор тоже вызывается?
Конечно вызывается, например автомобиль является транспортным средством, создавая объект автомобиля создается и транспортное средство.
По твоей логике выходит так: создается объект автомобиля который является транспортным средством но при этом само транспортное средство не создается - где логика?
1
Hagrael
БТР - мой друг
331 / 273 / 2
Регистрация: 07.01.2010
Сообщений: 1,932
15.06.2012, 07:26  [ТС] #7
Jupiter, да, понимаю, это логично. Но если я хочу полностью переписать конструктор предка, т. е. сделать так, чтобы конструктор работал совершенно по-другому. Но ведь тогда вызов предыдущего конструктора будет бессмыслен. Его вызов, значит, отменить никак нельзя?
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
15.06.2012, 07:33 #8
Hagrael, ок. Произвели полную переконфигурацию, делаем не автомобиль, а самолет. И что, это не транспортное средство? В каком месте вызов конструктора будет бессмысленен?
1
Hagrael
БТР - мой друг
331 / 273 / 2
Регистрация: 07.01.2010
Сообщений: 1,932
15.06.2012, 08:11  [ТС] #9
soon, понятно, значит, на практике это никогда не нужно. Всем спасибо, все понял!
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
15.06.2012, 11:44 #10
Цитата Сообщение от Hagrael Посмотреть сообщение
Jupiter, да, понимаю, это логично. Но если я хочу полностью переписать конструктор предка, т. е. сделать так, чтобы конструктор работал совершенно по-другому. Но ведь тогда вызов предыдущего конструктора будет бессмыслен. Его вызов, значит, отменить никак нельзя?
Ну так напиши у предка два конструктора:
1) Обычный
2) Специально для того случая когда ты при наследовании надумаешь его вызвать.

Не вижу проблемы, ты ведь при наследовании сам решаешь какой конструктор предка вызывать.
1
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
15.06.2012, 16:30 #11
Hagrael, если у вас появилась необходимость в этом - значит плоха архитектура. Если наследовать круг от квадрата, возможно, и появится необходимость полностью переписывать логику инициализации. Однако такое наследование бред.
1
Hagrael
БТР - мой друг
331 / 273 / 2
Регистрация: 07.01.2010
Сообщений: 1,932
16.06.2012, 15:35  [ТС] #12
Понятно!
0
16.06.2012, 15:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2012, 15:35
Привет! Вот еще темы с ответами:

Наследование конструкторов? - C++
Сдаю лабораторную на тему наследования в С++ : #include &lt;iostream&gt; using namespace std; class hero { protected: int jiv; ...

Наследование конструкторов классов - C++
может ли конструктор класса-наследника иметь меньше переменных,чем конструктор класса-отца?

Явное наследование конструкторов - C++
Если препод требует наследовать констуркторы явно что он имеет ввиду делать это только для дефолтных конструкторов или для не дефолтных...

Наследование конструкторов с параметрами и деструктора - C++
Данно два класс. Родитель: class entity { private: int ID = 0; class object_list * list_; protected: std::string...


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

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

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