7.3. Konstruktory, destruktory a dědičnost

Časová náročnost
Časová náročnost: 9 minut

Když má základní i odvozená třída konstruktor a destruktor jsou konstruktory spouštěny při odvozování. Destruktory funkcí jsou poté spouštěny v opačném pořadí. Konstruktor základní třídy je spouštěn před konstruktorem odvozené třídy. Pro destruktory je to naopak.

Pokud chceme předat argumenty konstruktoru odvozené třídy, předáváme mu argumenty obvyklým způsobem popsaným v jedné z předcházejících kapitol. Pokud chceme předat argumenty konstruktoru základní třídy, je zaveden tzv. řetězec předávaných argumentů. Nejdříve se veškeré argumenty základní i odvozené třídy předají konstruktoru odvozené třídy. Použitím rozšířeného formátu deklarace konstruktoru odvozené třídy dopředně předáme příslušné argumenty do třídy základní. Viz syntaxe:
odvozený-konstruktor(seznam-argumentů):báze(seznam-argumentů) {
   // tělo-konstruktoru-odvozené-třídy
};


Kde báze je název základní třídy. Je přípustné, aby odvozená i základní třída užívaly stejný argument. Je také možné, aby třída ignorovala všechny argumenty a pouze je dopředně předala základní třídě.

Tento program ukazuje, jak přebírá konstruktor odvozené třídy i konstruktor základní třídy argument. V tomto případě jsou argumenty stejné.

src/7_4.cpp
Příklad 7.4.
#include <iostream.h>

class base {
  int i;
public:
  base(int n) { 
    cout << "Constructing base class\n"; 
    i = n;
  }
  ~base() { cout << "Destructing base class\n"; }
  void showi() { cout << i << '\n'; }
};

class derived : public base {
  int j;
public:
  derived(int n) : base(n) { // predani argumentu do zakladni tridy
    cout << "Constructing derived class\n"; 
    j = n;
  } 
  ~derived() { cout << "Destructing derived class\n"; }
  void showj() { cout << j << '\n'; }
};

int main()
{
  derived o(10);

  o.showi();
  o.showj();
  
  return 0;
}



Následující příklad ukazuje jak konstruktoru a destruktoru předat různé argumenty. V takovém případě musíme předat konstruktoru odvozené třídy všechny argumenty potřebné pro obě třídy. Potom odvozená třída předá argumenty nutné pro základní třídu dopředně.

src/7_5.cpp
Příklad 7.5.
#include <iostream.h>

class base {
  int i;
public:
  base(int n) { 
    cout << "Constructing base class\n"; 
    i = n;
  }
  ~base() { cout << "Destructing base class\n"; }
  void showi() { cout << i << '\n'; }
};

class derived : public base {
  int j;
public:
  derived(int n, int m) : base(m) { // predani argumentu zakladni tride
    cout << "Constructing derived class\n"; 
    j = n;
  } 
  ~derived() { cout << "Destructing derived class\n"; }
  void showj() { cout << j << '\n'; }
};

int main()
{
  derived o(10, 20);

  o.showi();
  o.showj();
  
  return 0;
}