7.1. Řízení přístupu k základní třídě

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

Při dědění se používá tato syntaxe:
Class jméno-odvozené-třídy:access jméno-základní třídy
{
   // tělo třídy
}


Kde na místo access dosadíme jedno z následujících klíčových slov: public, private nebo protected.

To jakým způsobem ke třídě přistupujeme, určuje, jak jsou elementy základní třídy děděny odvozenou třídou.

Pokud použijeme klíčové slovo:

upozornění
  • public pak se všechny obecné členy základní třídy stanou privátními členy odvozené třídy.
  • private pak se všechny veřejné členy základní třídy stanou privátními členy odvozené třídy. Všechny privátní členy základní třídy zůstávají privátními a nejsou pro odvozenou třídu přístupné.
  • protected pak platí stejná pravidla jako u klíčového slova private, pouze s tím rozdílem, že chráněné členy základní třídy jsou přístupné členům kterékoliv třídy, odvozené z této základní třídy. Vně základní nebo odvozené třídy nejsou chráněné členy přístupné.

Jestliže není specifikátor access uveden a je-li odvozená třída class, pak je brán jako standard private Je-li odvozenou třídou struct pak je jako standard brán public.

V zájmu srozumitelnosti je vhodné specifikátor uvádět.

V následujícím příkladu si ukážeme základní třídu a odvozenou třídu, která ji dědí jako veřejná.

src/7_1.cpp
Příklad 7.1.
#include <iostream.h>

class base {
  int x;
public:
  void setx(int n) { x = n; }
  void showx() { cout << x << '\n'; }
};

// dedi jako verejnou
class derived : public base {
  int y;
public:
  void sety(int n) { y = n; }
  void showy() { cout << y << '\n'; }
};
 
int main()
{
  derived ob;

  ob.setx(10); // pristup clena zakladni tridy
  ob.sety(20); // pristup clena odvozene tridy

  ob.showx(); // pristup clena zakladni tridy
  ob.showy(); // pristup clena odvozene tridy

  return 0;
}

Pokud bychom však v tomto režimu chtěli přistupovat k proměnné x došlo by k chybě a to z toho důvodů, že pokud odvozená třída dědí jako veřejná, pak nemá přístup k privátním členům základní třídy.

Na dalším programu si ukážeme, že se veřejné členy základní třídy stávají privátními členy odvozené třídy a jsou stále přístupné uvnitř odvozené třídy pokud odvozená třída dědí třídu základní jako private.

src/7_2.cpp
Příklad 7.2.
#include <iostream.h>

class base {
  int x;
public:
  void setx(int n) { x = n; }
  void showx() { cout << x << '\n'; }
};

// Dedime zakladni tridu jako private
class derived : private base {
  int y;
public:
  // setx a showx jsou pristupne z odvozene tridy
  void setxy(int n, int m) { setx(n); y = m; }
  void showxy() { showx(); cout << y << '\n'; }
};
 
int main()
{
  derived ob;

  ob.setxy(10, 20); 

  ob.showxy();

  /* ob.setx(10); 
     je chyba, protoze funkce setx() se stavaji privatnimi k derived
     a nejsou z vnejsku pristupne. */

  return 0;
}

Jak je v poznámce správně uvedeno, pokud dědíme základní třídu jako private pak se veřejné členy základní třídy stanou privátními členy odvozené třídy a nejsou tudíž z vnějšku přístupné.