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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
#1

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

29.08.2011, 21:55. Просмотров 1226. Ответов 5

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?
И как вообще расписать работу с родителями, если они должны инициализироваться по ссылкам на элементы потомка, но при этом для родителей актуальны фактические значения по ссылкам?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.08.2011, 21:55     Порядок инициализации предков
Посмотрите здесь:

Порядок инициализации членов класса - C++
Здравствуйте форумчане. Столкнулся с проблемой. Не могу найти доходчивой статьи на данный вопрос про инициалиазцию членов в классе. ...

Порядок переменных в списке инициализации - C++
Есть класс, в нем 2 поля ссылка и bool, если в списке инициализации написать так :ссылка(NULL),bool(true) то компилятор выдает...

Порядок инициализации полей в конструкторе - C++
Имеется некий класс T. В нём имеются поля m_F1 (указатель) и m_F2 (неважно). Конструктор выглядит так: T::T() : m_F1 (new ...), ...

Что такое порядок инициализации таблицы виртуальных методов? - C++
Что-то я не переварил это.

Восстановление предков обхода в ширину - C++
На шахматной доске NxN в клетке (x1, y1) стоит голодный шахматный конь. Он хочет попасть в клетку (x2, y2), где растет вкусная шахматная...

Найти всех предков человека с номером p - C++
заданы n человек и два массива натуральных чисел mother и father, такие, что mother – номер матери i-го человека, а father – номер его...

файл инициализации - C++
подскажите как можно в программе записать функцию GetPrivateProfileInt нашел синтаксис UINT WINAPI GetPrivateProfileInt( _In_ ...

Ошибка инициализации - C++
Помогите пожалуйста исправить ошибку в этой программе #include <iostream> using namespace std; #include <cstring> class ZOO ...

Ошибка инициализации - C++
Доброго времени суток! У меня такая проблема, создал небольшой проект в windows forms, ну мой первый калькулятор, фактически это мое первое...

Списки инициализации - C++
Подскажите пожалуйста, как составить список инициализации для конструктра следующего класса? class Droid{ public: ...

Ошибка инициализации - C++
При такой инициализации вылезают ошибки: error C2064: term does not evaluate to a function taking 7 arguments IntelliSense: call of...

Конструктор инициализации - C++
Как передать параметры конструктору, если объект класса определен как указатель? #include <iostream> using namespace...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
29.08.2011, 23:34     Порядок инициализации предков #5
зачем вам множественное наследование?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 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     Порядок инициализации предков
Ответ Создать тему
Опции темы

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