7.4. Vícenásobná dědičnost

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

upozornění Existují dva způsoby, jak mohou odvozené třídy zdědit více než jednu základní třídu.
  1. Odvozená třídy může být použita jako základní třída pro další odvozenou třídu, vytvořením víceúrovňové hierarchie třídy.
  2. Odvozená třída může zdědit více než jednu základní třídu.

Ad 1) Původní základní třída je označena za nepřímou (indirect) základní třídu druhé odvozené třídy. V tomto případě platí, že jakákoliv třída, bez ohledu na to, jak byla vytvořena může být základní třídou. Dále platí, že v tomto případě, jsou konstruktory funkcí všech tříd nazývány podle pořadí odvozování. Také destruktory jsou volány v opačném pořadí.

Ad 2) Dvě nebo více základních tříd je zkombinováno tak, aby pomohly vytvořit odvozenou třídu. V tomto případě používáme následující syntaxi:
class jméno-odvozené třídy:access base1, access base2, ..., access baseN
{
   // tělo-třídy
}


base1, ..., baseN jsou jména základních tříd. Access je přístupový specifikátor, který může být jiný pro každou třídu. Konstruktory jsou v tomto případě spouštěny zleva doprava, neboli v tom pořadí v jakém jsou zapsány. Destruktory jsou spouštěny v opačném pořadí.

Následující program ukazuje odvozenou třídu, která dědí od jiné odvozené třídy.

src/7_6.cpp
Příklad 7.6.
#include <iostream.h>

class B1 {
  int a;
public:
  B1(int x) { a = x; }
  int geta() { return a; }
};

// dedeni ze zakladni tridy
class D1 : public B1 {
  int b;
public:
  D1(int x, int y) : B1(y)
  {
    b = x;
  }
  int getb() { return b; }
};

// dedeni z odvozene tridy
class D2 : public D1 { 
  int c;
public:
  D2(int x, int y, int z) : D1(y, z) 
  {
    c = x;
  }

  void show() {
    cout << geta() << ' ' << getb() << ' ';
    cout << c << '\n';
  }
};

int main()
{
  D2 ob(1, 2, 3);

  ob.show();
   cout << ob.geta() << ' ' << ob.getb() << '\n';

  return 0;
}


Následující program ukazuje předcházejí program přepracovaný tak, aby odvozená třída dědila přímo ze dvou základních tříd.

src/7_7.cpp
Příklad 7.7.
#include <iostream.h>

// prvni zakladni trida
class B1 {
  int a;
public:
  B1(int x) { a = x; }
  int geta() { return a; }
};

// druha zakladni trida
class B2 {
  int b;
public:
  B2(int x) 
  {
    b = x;
  }
  int getb() { return b; }
};

// dedim ze dvou zakladnich trid
class D : public B1, public B2 { 
  int c;
public:
  D(int x, int y, int z) : B1(z), B2(y)
  {
    c = x;
  }

  void show() {
    cout << geta() << ' ' << getb() << ' ';
    cout << c << '\n';
  }
};

int main()
{
  D ob(1, 2, 3);

  ob.show();

  return 0;
}