7.3. Konstruktory, destruktory a dědič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é.
| 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ě.
| 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;
}
|