переходом до множинного спадкоємства порядок виконання конструкторів стає дуже важливий. Цей порядок виклику наступний:
(1) конструктори всіх віртуальних базових класів; якщо їх є більше одного, то конструктори викликаються в порядку їх успадкування;
(2) конструктори Невіртуальна базових класів в порядку їх успадкування;
(3) конструктори всіх компонентних класів.
Розглянемо наступний приклад.
# include Base1 {() {cout <<"Створення Base1" <
}; Base2 {() {cout <<"Створення Base2" <
}; Base3 {() {cout <<"Створення Base3" <
}; Base4 {() {cout <<"Створення Base4" <
}; Derived: private Base1, private Base2, private Base3 {anObject; () {}
}; main () {anObject;
}
На виході цієї програми буде наступне:
Створення Base1
Створення Base2
Створення Base3
Створення Base4
Додавання в конструктор для Derived конкретних викликів з іншим порядком і повторення програми не змінить повідомлення після виконання цієї програми.
Derived: private Base1, private Base2, private Base3 {anObject; (): anObject (), Base3 (), Base2 (), Base1 () {}
};
Зміна порядку спадкування класів змінить послідовно-ність появи повідомлень на виході програми. Оголосивши Derived наступним чином:
Derived: private Base3, private Base2, private Base1 {anObject; (): anObject (), Base1 (), Base2 (), Base3 () {}
};
можна отримати на виході програми:
Створення Base3
Створення Base2
Створення Base1
Створення Base4
Послідовність виклику деструкторів буде зворотною щодо послідовності виклику конструкторів.
Необхідність використання в програмі множинного спадкоємства найчастіше говорить про погану структуризації класів. Це могло виникнути в тому випадку, якщо програміст приділив недостатньо часу для предваритель аналізу предметної області програми на найпершому етапі її складання. Структурний підхід до об'єктно-орієнтованого проектування передбачає більш чітку організацію класів. br/>
3. Адреси базових класів
Велике число проблем при проектуванні об'єктно-орієнтованих програм виникає у зв'язку зі способом розміщення похідних класів в пам'яті. Одн...