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

Порядок инициализации предков - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
29.08.2011, 21:55     Порядок инициализации предков #1
C++
1
2
3
4
5
6
7
8
9
10
class A {...};
class B {...};
class C : A,B
{ private:
    int Var;
  public:
  C(const int &v) : A(&Var), B(&Var)
  { Var=v+5;
  }
};
Когда будут запущены конструкторы A и B? До или после C?
И как вообще расписать работу с родителями, если они должны инициализироваться по ссылкам на элементы потомка, но при этом для родителей актуальны фактические значения по ссылкам?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Enfernuz
 Аватар для Enfernuz
22 / 22 / 1
Регистрация: 11.04.2011
Сообщений: 67
29.08.2011, 22:11     Порядок инициализации предков #2
Конструкторы будут запущены в порядке A,B,C. Деструкторы наоборот.

если они должны инициализироваться по ссылкам на элементы потомка, но при этом для родителей актуальны фактические значения по ссылкам?
Не совсем понятно. Поясните на примере, если не трудно.
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
29.08.2011, 23:17  [ТС]     Порядок инициализации предков #3
Вообще, я разбираюсь с проблеммой http://ru.wikipedia.org/wiki/Ромбовидное_наследование и хочу понять как создавать систему классов в которых при множественном наследовании суперкласс не "размножается". В C++ без виртуальных объектов не обойтись, а мне они кажутся не удобными (плохо понимаемыми).

Обход этой проблеммы, я представляю в виде отказа от суперкласса для родителей, и ввод этого класса как отдельное поле в класс потомка. В моем примере суперкласс моделируется полем Var. Но возникает другая проблема - Var надо инициализировать до инициализации A и B, но сама инициализация Var возможна только в конструкторе. Т.е. у родителей могут быть параметры связанные с конкретными значениями у потомка.

Если б инициализация Var была простой, то можно просто поставить конструктор для Var до вызова конструкторов A и B. Но если логика будет сложнее, то возможна ситуация когда необходима последовательность вызовов конструкторов C,A,B.
Bers
Заблокирован
29.08.2011, 23:32     Порядок инициализации предков #4
Цитата Сообщение от skvor Посмотреть сообщение
В C++ без виртуальных объектов не обойтись, а мне они кажутся не удобными (плохо понимаемыми).
Вы имеете ввиду полиморфизм?

А... понял.. А не проще в принципе избегать такого наследования?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
29.08.2011, 23:34     Порядок инициализации предков #5
зачем вам множественное наследование?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
30.08.2011, 07:20     Порядок инициализации предков #6
Цитата Сообщение от skvor Посмотреть сообщение
C(const int &v) : A(&Var), B(&Var)
Ошибка, на которую должен намекнуть даже компилятор. А и В инициализируются не инициализированной переменной Var.
Кроме того, у тебя закрытое множественное наследование. Обрати внимание на слово "закрытое".
Yandex
Объявления
30.08.2011, 07:20     Порядок инициализации предков
Ответ Создать тему

Метки
классы, конструктор, множественное, наследование
Опции темы

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