12.07.2015 Views

C++ - VideoTutorials-bg.com

C++ - VideoTutorials-bg.com

C++ - VideoTutorials-bg.com

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Дефинирането и използването на виртуални класове има редицаособености. Една от тях касае дефиницията и използването наконструкторите на наследените класове. Нека A е виртуален основенклас за класа B, а класът B е основен за класа D, който пък е основенза класа E. Ако класът A има конструктор с параметри и нямаподразбиращ се конструктор, то този конструктор трябва да бъдеизвикан не само от конструктора на класа B, но и от конструкторитена класовете D и E. Правилото за извикване на конструктори спараметри на виртуални класове може да се изкаже така: конструкторитес параметри на виртуални класове трябва да се извикват отконструкторите на всички класове, които са техни наследници, а несамо от конструкторите на преките им наследници. С други думи,производният клас е отговорен за инициализирането на класовете, откоито произлиза, както и на всички виртуални основни класове. Ако винициализиращия списък на конструктора на производен клас нямаобръщение към конструктор с параметър на виртуалния клас, използва сенеговия подразбиращ се конструктор, ако такъв съществува или сесъобщава за отсъстието на подходящ конструктор.В примера по-горе са дефинирани конструктори с параметри закласовете A, B, C и D. Ще отбележим, че конструкторът с параметри накласа D:D(int a, int b, int c, int d): A(a), B(a, b), C(c, d){}явно в инициализиращия си списък се обръща към конструктора навиртуалния основен клас А. Ако това не е направено, компилаторът щесъобщи за грешка, тъй като във виртуалния основен клас A не еопределен конструктор по подразбиране. Ако класът А не беше виртуаленнеговият конструктор нямаше да се изисква в дефиницията наконструктора на класа D и употребата му щеше да доведе до грешка.Друга особеност е промяната на реда на инициализиране.Инициализирането на виртуални основни класове предхождаинициализирането на другите основни класове в декларацията напроизводния клас. Ако производен клас наследява основен и виртуаленклас, конструкторът на виртуалния клас се извиква първи. При няколковиртуални класа извикването на конструкторите става по реда им вдекларацията на производния клас.25

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!