7.1. Řízení přístupu k základní třídě
| Č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:
|
- 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á.
|
| 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.
| 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é.