Конструктор і Деструктор у Спадкуванні
Спочатку конструктор базового класу
У контексті наслідування конструктори відіграють важливу роль у правильній ініціалізації похідних класів. Розуміння послідовності виклику конструкторів є ключовим для засвоєння динаміки наслідування. Ознайомтеся з результатом виконання наведеного нижче фрагмента коду, щоб побачити порядок виклику конструкторів.
main.cpp
12345678910111213141516#include <iostream> class Base { public: Base() { std::cout << "Base constructor called" << std::endl; } }; class Derived : public Base { public: Derived() { std::cout << "Derived constructor called" << std::endl; } }; int main() { Derived derivedObj; }
Після завершення ініціалізації конструктором базового класу, виконується конструктор похідного класу.
Базовий клас викликається першим, оскільки він має ініціалізувати успадковані члени підкласу. Це гарантує, що підклас починає роботу з коректним станом і може покладатися на ініціалізований стан свого базового класу.
main.cpp
123456789101112131415161718class Base { public: Base(int value) : data(value) {} private: int data; }; class Derived : public Base { public: Derived(int value) : Base(value) {} }; int main() { }
У цьому прикладі конструктор із параметрами викликається у списку ініціалізації. Необхідно явно викликати конструктор базового класу у списку ініціалізації конструктора підкласу. Якщо у списку ініціалізації не вказати конструктор базового класу, конструктор за замовчуванням базового класу буде викликано автоматично.
Деструктор похідного класу викликається першим
Під час знищення об'єкта деструктори викликаються у зворотному порядку до їхніх конструкторів. Це означає, що деструктор спочатку викликається для найбільш похідного класу, а потім для кожного базового класу у зворотному порядку їх оголошення.
main.cpp
12345678910111213141516#include <iostream> class Base { public: ~Base() { std::cout << "Base destructor called" << std::endl; } }; class Derived : public Base { public: ~Derived() { std::cout << "Derived destructor called" << std::endl; } }; int main() { Derived derivedObj; }
Лише після завершення очищення деструктора похідного класу викликається деструктор базового класу.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Awesome!
Completion rate improved to 3.13
Конструктор і Деструктор у Спадкуванні
Свайпніть щоб показати меню
Спочатку конструктор базового класу
У контексті наслідування конструктори відіграють важливу роль у правильній ініціалізації похідних класів. Розуміння послідовності виклику конструкторів є ключовим для засвоєння динаміки наслідування. Ознайомтеся з результатом виконання наведеного нижче фрагмента коду, щоб побачити порядок виклику конструкторів.
main.cpp
12345678910111213141516#include <iostream> class Base { public: Base() { std::cout << "Base constructor called" << std::endl; } }; class Derived : public Base { public: Derived() { std::cout << "Derived constructor called" << std::endl; } }; int main() { Derived derivedObj; }
Після завершення ініціалізації конструктором базового класу, виконується конструктор похідного класу.
Базовий клас викликається першим, оскільки він має ініціалізувати успадковані члени підкласу. Це гарантує, що підклас починає роботу з коректним станом і може покладатися на ініціалізований стан свого базового класу.
main.cpp
123456789101112131415161718class Base { public: Base(int value) : data(value) {} private: int data; }; class Derived : public Base { public: Derived(int value) : Base(value) {} }; int main() { }
У цьому прикладі конструктор із параметрами викликається у списку ініціалізації. Необхідно явно викликати конструктор базового класу у списку ініціалізації конструктора підкласу. Якщо у списку ініціалізації не вказати конструктор базового класу, конструктор за замовчуванням базового класу буде викликано автоматично.
Деструктор похідного класу викликається першим
Під час знищення об'єкта деструктори викликаються у зворотному порядку до їхніх конструкторів. Це означає, що деструктор спочатку викликається для найбільш похідного класу, а потім для кожного базового класу у зворотному порядку їх оголошення.
main.cpp
12345678910111213141516#include <iostream> class Base { public: ~Base() { std::cout << "Base destructor called" << std::endl; } }; class Derived : public Base { public: ~Derived() { std::cout << "Derived destructor called" << std::endl; } }; int main() { Derived derivedObj; }
Лише після завершення очищення деструктора похідного класу викликається деструктор базового класу.
Дякуємо за ваш відгук!