Конструктор і Деструктор у Спадкуванні
Спочатку конструктор базового класу
У контексті наслідування конструктори відіграють важливу роль у правильній ініціалізації похідних класів. Розуміння послідовності виклику конструкторів є ключовим для засвоєння динаміки наслідування. Ознайомтеся з результатом виконання наведеного нижче фрагмента коду, щоб побачити порядок виклику конструкторів.
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; }
Тільки після завершення очищення деструктора похідного класу викликається деструктор базового класу.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Can you provide an example code snippet to illustrate this?
Why is it important for the base class constructor to run before the derived class constructor?
What happens if the base class doesn't have a default constructor?
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; }
Тільки після завершення очищення деструктора похідного класу викликається деструктор базового класу.
Дякуємо за ваш відгук!