#include #include using namespace std; class C1 // базовий клас { protected: int j; double r; public: C1() {j = 0;} // конструктор ~C1() {cout << "Cпрацював деструктор" << endl;}// деструктор explicit C1(float j): j(j) {} // неявний конструктор копіювання C1( int k ) { j = k; } // конструктор C1( double s) { r = s;} // конструктор void show_j() { cout << j << endl;} void show_r() { cout << r << endl;} }; class C2 : public C1 // похідний клас { public: C2(): C1() {} // конструктор класу C2 викликає конструктор класу C1 C2(int m): C1(m) {} // m передано в конструктор класу C1 з параметром void j2 () {j *= j;} // піднесення j до квадрату }; class C3 : public C1 // похідний клас { public: C3(): C1() {} // конструктор класу C2 викликає конструктор класу C1 C3(double t): C1(t){} // t передадано в конструктор класу C1 з параметром void root () {r = sqrt(r);} //d }; int main() { C1 F(3); // Об'єкт базового класу cout << "j 1 класу = "; F.show_j(); C1 F_clone = F; cout << "j клона 1 класу = "; F_clone.show_j(); F=4; // Зміна значення об'єкта 1-го класу, спрацює деструктор cout << "j 1 класу = "; F.show_j(); cout << "j клона 1 класу = "; F_clone.show_j(); // Значення клону залишилось без змін C2 S(4); // Об'єкт похідного класу cout << "j 2 класу = "; S.show_j();// Виклик методу базового класу S.j2(); // Піднесення j до квадрату cout << "після піднесення до квадрату j 2 класу = "; S.show_j(); C3 T(1.21); // Об'єкт похідного класу cout << "j 3 класу = "; T.show_r(); // Виклик методу базового класу T.root(); // Корінь квадратний з j cout << "після витягування квадратного кореня j 3 класу = "; T.show_r(); cout << endl; return 0; }