“Примерна” задача №1.
Да имам и уникалното именуване на Павлов или на Бъчваров, даже не знам чие произведение са контролните.
#include <iostream> using namespace std; class A { public: A(int nValue) { cout << "A: " << nValue << endl; } }; class B : public A { public: B(int nValue, double dValue) : A(nValue) { cout << "B: " << dValue << endl; } }; class C : public B { public: C(int nValue, double dValue, char chValue) : B(nValue, dValue) { cout << "C: " << chValue << endl; } }; int main() { C cClass(5, 4.3, 'R'); return 0; }
Output-а на програмата:
A: 5 B: 4.3 C: R
Обяснението за последователността на изпълнението на програмата е следното:
Започваме със създаването на обект от клас-наследника С, но при извикване на подходящия (единствения) конструктор на този клас се извиква конструктора на своя родител (class B), а B от своя страна извиква конструктора на неговия родител (class A). В А е дъното на наследяването и за това първо се изпълнява неговия конструктор, и т.н. в обратен ред се изпълняват конструкторите на В и С. Всеки клас-наследник разширява своя родител, заради което при създаването първо се изпълнява конструктора на клас-родителя. При унищожаването е на обратно, първо се премахва разширената част на класа на наследника и след това общата от класа на родителя.
Конструкторите винаги се изпълняват от родителя -> наследника,
докато при деструкторите е обратното от наследника -> родителя.