Konstruktori ja Destruktori Periytymisessä
Kantaluokan konstruktori ensin
Periytymisessä konstruktorit ovat keskeisessä roolissa johdettujen luokkien oikeassa alustuksessa. Konstruktoreiden kutsumisjärjestyksen ymmärtäminen on avainasemassa periytymisen dynamiikan hahmottamisessa. Tarkastele alla olevan koodiesimerkin tulostetta nähdäksesi konstruktoreiden kutsujärjestyksen.
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; }
Kun kantaluokan konstruktori on suorittanut alustuksensa, suoritetaan johdetun luokan konstruktori.
Yliluokka kutsutaan ensin, koska sen täytyy alustaa aliluokan perityt jäsenet. Tämä varmistaa, että aliluokka alkaa kelvollisessa tilassa ja voi luottaa kantaluokan alustettuun tilaan.
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() { }
Esimerkissä konstruktori kutsutaan parametreilla alustajaluettelossa. Sinun täytyy erikseen kutsua yliluokan konstruktoria aliluokan konstruktorin alustajaluettelossa. Jos et määritä kantaluokan konstruktoria alustajaluettelossa, yliluokan oletuskonstruktori kutsutaan automaattisesti.
Johdetun luokan destruktori ensin
Kun olio tuhotaan, destruktorit kutsutaan päinvastaisessa järjestyksessä kuin konstruktorit. Tämä tarkoittaa, että destruktorit kutsutaan ensin johdetulle luokalle ja sen jälkeen jokaiselle kantaluokalle käänteisessä määrittelyjärjestyksessä.
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; }
Vasta kun johdetun luokan destruktori on suorittanut siivouksensa, kutsutaan kantaluokan destruktoria.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Awesome!
Completion rate improved to 3.13
Konstruktori ja Destruktori Periytymisessä
Pyyhkäise näyttääksesi valikon
Kantaluokan konstruktori ensin
Periytymisessä konstruktorit ovat keskeisessä roolissa johdettujen luokkien oikeassa alustuksessa. Konstruktoreiden kutsumisjärjestyksen ymmärtäminen on avainasemassa periytymisen dynamiikan hahmottamisessa. Tarkastele alla olevan koodiesimerkin tulostetta nähdäksesi konstruktoreiden kutsujärjestyksen.
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; }
Kun kantaluokan konstruktori on suorittanut alustuksensa, suoritetaan johdetun luokan konstruktori.
Yliluokka kutsutaan ensin, koska sen täytyy alustaa aliluokan perityt jäsenet. Tämä varmistaa, että aliluokka alkaa kelvollisessa tilassa ja voi luottaa kantaluokan alustettuun tilaan.
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() { }
Esimerkissä konstruktori kutsutaan parametreilla alustajaluettelossa. Sinun täytyy erikseen kutsua yliluokan konstruktoria aliluokan konstruktorin alustajaluettelossa. Jos et määritä kantaluokan konstruktoria alustajaluettelossa, yliluokan oletuskonstruktori kutsutaan automaattisesti.
Johdetun luokan destruktori ensin
Kun olio tuhotaan, destruktorit kutsutaan päinvastaisessa järjestyksessä kuin konstruktorit. Tämä tarkoittaa, että destruktorit kutsutaan ensin johdetulle luokalle ja sen jälkeen jokaiselle kantaluokalle käänteisessä määrittelyjärjestyksessä.
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; }
Vasta kun johdetun luokan destruktori on suorittanut siivouksensa, kutsutaan kantaluokan destruktoria.
Kiitos palautteestasi!