2012-03-16 5 views
7

Я новичок в C++, особенно об объектно-ориентированном программировании. И теперь у меня проблема во время обучения.Заказ конструктора в виртуальном наследовании

Существует иерархия классов следующего:

class Class{}; 

class Base:public Class{}; 

class Derived1:virtual public Base{}; 

class Derived2:virtual public Base{}; 

class MI:public Derived1,public Derived2{}; 

class Final:public MI,public Class{}; 

И теперь я хочу знать, что порядок конструктора для определения заключительного объекта класса.

начертить схему: enter image description here structure of class inheritance http://hi.csdn.net/attachment/201203/16/2712336_1331902452BziD.jpg

Я знаю виртуальные базовые классы всегда построенные до базовых классов не виртуальной, независимо от того, где они появляются в иерархии наследования. Я запутался в том, что если конструктор класса Class находится перед базой, а если конструктор класса вызывается дважды. И почему?

Может кто-нибудь сказать мой ответ? Чем детальнее, тем лучше.

+7

Довольно легко разобраться в ленивом пути. Построить программу. Поместите отладочные сообщения cout в каждый из ваших конструкторов (.e.g «Я базовый конструктор!»). Соблюдайте порядок построения, следуя инструкциям cout. –

+3

предупреждение: прямая база 'Class' недоступна в' Final' из-за двусмысленности –

+0

@ 0A0D: Конечно, это только говорит вам о том, как реализуется ее компилятор. Это может быть достаточно для вас, но, возможно, это не так. :) –

ответ

8

Прямое наследование по ClassFinal и Base не virtual, поэтому экземпляр Final имеет два базового класса подобъектами типа Class. Тот, который является прямым основанием Base, сконструирован до Base, и тот, который является прямым основанием Final, строится впоследствии (фактически после MI).

Причина заключается в том, что:

  1. прямые основания строятся в порядке, они перечислены (если они не виртуальную базу, которая была построена уже),
  2. построены базисы до класса запускается собственный конструктор.

Применение (1) к Final говорит нам, что Class построена после MI. Применяя (2) несколько раз, мы сообщаем, что Class построен до Base, до Derived1 и Derived2, до MI.

Смежные вопросы