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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.80
Hagrael
БТР - мой друг
 Аватар для Hagrael
331 / 273 / 2
Регистрация: 07.01.2010
Сообщений: 1,932
12.06.2012, 15:24     Наследование конструкторов #1
Здравствуйте! У меня такой вопрос: Как сделать так, чтобы при создании объекта дочернего класса не вызывался конструктор родительского? При таком коде вызывается и тот, и тот конструкторы:
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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2012, 15:24     Наследование конструкторов
Посмотрите здесь:

Наследование конструкторов? C++
C++ Наследование конструкторов
C++ Наследование конструкторов
Явное наследование конструкторов C++
Наследование конструкторов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.06.2012, 15:36     Наследование конструкторов #2
Цитата Сообщение от Hagrael Посмотреть сообщение
Как сделать так, чтобы при создании объекта дочернего класса не вызывался конструктор родительского?
никак ты это не сделаешь ибо это противоречит наследованию
Nick Alte
Эксперт С++
1561 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,896
Завершенные тесты: 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;
}
Hagrael
БТР - мой друг
 Аватар для 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) {}
Я никогда раньше не видел такого описания функций
В учебнике написано, что если ты не создаешь конструктор в потомке, то будет вызван родительский конструктор, после чего все переменные потомка обнулятся. Но что если я написал свой конструктор для потомка? Выходит, в этом случае родительский конструктор тоже вызывается?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
13.06.2012, 13:14     Наследование конструкторов #5
Hagrael, Вызывается очевидно. Читайте про список инициализации.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.06.2012, 14:52     Наследование конструкторов #6
Цитата Сообщение от Hagrael Посмотреть сообщение
В учебнике написано, что если ты не создаешь конструктор в потомке, то будет вызван родительский конструктор
Конструктор родителя всегда будет вызван

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

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

Не вижу проблемы, ты ведь при наследовании сам решаешь какой конструктор предка вызывать.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.06.2012, 16:30     Наследование конструкторов #11
Hagrael, если у вас появилась необходимость в этом - значит плоха архитектура. Если наследовать круг от квадрата, возможно, и появится необходимость полностью переписывать логику инициализации. Однако такое наследование бред.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2012, 15:35     Наследование конструкторов
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Hagrael
БТР - мой друг
 Аватар для Hagrael
331 / 273 / 2
Регистрация: 07.01.2010
Сообщений: 1,932
16.06.2012, 15:35  [ТС]     Наследование конструкторов #12
Понятно!
Yandex
Объявления
16.06.2012, 15:35     Наследование конструкторов
Ответ Создать тему
Опции темы

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