Klasy pochodne

W przypadku, gdy potrzebna jest nam klasa podobna do już istniejącej, możemy stworzyć jej klasę pochodną. Definicja klasy B, która jest klasą pochodną klasy A jest następująca:
class B: public A {
public:
   // składowe publiczne
private:
   // składowe prywatne
};
Każdy obiekt klasy B będzie posiadał zarówno pola i metody zadeklarowane w klasie A jak i te zadeklarowane w klasie B. Przy tworzeniu obiektu klasy pochodnej najpierw wywoływany jest konstruktor klasy bazowej, a później konstruktor klasy pochodnej. Kiedy obiekt jest niszczony, kolejność wywołania destruktorów jest odwrotna - najpierw wywoływany jest destruktor klasy pochodnej, a później destruktor klasy podstawowej. Jeśli konstruktor klasy bazowej wymaga podania argumentów, podajemy je na liście inicjującej.

Składowe klasy podstawowe są dostępne w klasie pochodnej, jeśli zostały zadeklarowane jako publiczne lub chronione (protected), a składowe prywatne są niedostępne.

Przykład:

class Punkt {
public:
   Punkt(double _x, double _y): x(_x), y(_y) {}
   void przesuń(double dx, double dy) { x+=dx; y+=dy; }
   void drukuj() { cout << "(" << x << "," << y << ")"; }
protected:
   double x, y;
};
class KolorowyPunkt: public Punkt {
public:
   KolorowyPunkt(double _x, double _y, int _kolor): Punkt(_x, _y), kolor(_kolor) {}
   void ustawKolor(int _kolor) { kolor=_kolor; }
   void drukuj() { Punkt::drukuj(); cout << "kolor " << kolor; }
private:
   int kolor;
};

Uwagi:

  1. Można definiować prywatne klasy pochodne (używając w nagłówku słowa private, np. class B: private A) - wówczas pola
  2. Można definiować klasy, które są pochodnymi wielu klas wymieniając te klasy w nagłówku np. class B: public A, public X, public Y
  3. Metodę zdefiniowaną w klasie bazowej możemy ponownie zdefiniować w klasie pochodnej. Metoda taka wywoływana dla zmiennych klasy pochodnej będzie działać inaczej niż dla obiektów klasy podstawowej.