c ++, когда выполняется baseconstructor? - PullRequest
0 голосов
/ 05 марта 2012

Некоторые вопросы относительно наследования c ++:

В каком порядке выполняется код базовых конструкторов?

Есть ли способ повлиять на этот порядок?(например, другие языки позволяют размещать super () где-нибудь внутри конструктора)

Можно ли получить доступ к защищенным членам базовых классов в конструкторе?

Ответы [ 3 ]

1 голос
/ 05 марта 2012

Порядок построения хорошо определен в c ++. Построение начинается в списке инициализации complete (наиболее производный тип), из которого вызываются все остальные конструкторы. Сначала виртуальные базы, затем прямые базы в другом объявлении (они будут в том же порядке применять тот же порядок для создания своих собственных баз и членов) и, наконец, члены в порядке объявления в классе, а не в порядке, в котором кажется, что конструкторы вызываются в списке инициализации.

Нет способа повлиять на порядок, в котором происходит построение, и безопасно получить доступ к базовым элементам внутри конструкции производного типа. Что, вероятно, удивительно, так это обратный вызов виртуальной функции из базового конструктора. На каждом этапе процесса строительства тип объекта меняется. Таким образом, для объекта типа X с основами B_i, только после того, как все подобъекты B_i завершены, и непосредственно перед тем, как первый член X запускается, тип объекта становится X. Это означает, что вызов базового метода в базе класс будет отправлен в этот базовый класс, а не в конечный создаваемый тип.

1 голос
/ 05 марта 2012

Предположим, что класс A имеет i базовых классов B_i, все конструкторы B_i выполняются до выполнения любого кода для конструктора A. Единственное исключение - когда вы инициализируете базовый класс конструктором, отличным от заданного по умолчанию, но после запуска все базовые классы выполняются, и в любом случае они должны идти первыми в списке инициализатора. Доступ к защищенным членам базовых классов возможен, поскольку базовый класс уже создан.

Например:

class A : public B, C {
  A()
  : B(1), //B and C are now constructed
    memberOfA(memberOfB)
  {
  }
};

Если вашему члену memberOfA нужно что-то из B под названием memberOfB, то это нормально, потому что B. уже создан.

0 голосов
/ 05 марта 2012

Конструктор родительского / суперкласса всегда вызывается первым. Это верно рекурсивно в случае множественного наследования. (И это одна из причин, по которой вам не нужны виртуальные конструкторы с поведением в C ++;)) Что касается доступа к членам суперкласса: это прекрасно, они инициализированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...