7.5. Virtuální třídy

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

Mějme následující příklad:

V tomto příkladu je základní třída Base děděna jak Derived 1, tak Derived 2. Derived 3 přímo dědí obě třídy Derived. To ale znamená, že Base je děděna dvakrát. Jednou přes Derived 1 a podruhé přes Derived 2. Tím vzniká určitá nejednoznačnost.

C++ obsahuje mechanismus, který zajistí, aby k podobné nejednoznačnosti nedocházelo. Tato vlastnost se nazývá virtuální třída. Zabrání se tím, aby se dvě nebo více kopii základní třídy objevily ve třídě odvozené, která dědí nepřímo základní třídu. Abychom určili, že třída je chápána jako virtuální uvedeme jako specifikátor klíčové slovo virtual.

Výše popsaný příklad si nyní ukážeme.

src/7_8.cpp
Příklad 7.8.
#include <iostream.h>

class base {
public:
  int i;
};

// dedim zakladni tridu jako virtualni
class derived1 : virtual public base {
public:
  int j;
};

// dedim zakladni tridu jako virtualni
class derived2 : virtual public base {
public:
  int k;
};

// v toto tride je base dedena pouze jednou
class derived3 : public derived1, public derived2 {
public:
  int product() { return i * j * k; }
};

int main()
{
  derived3 ob;

  ob.i = 10;
  ob.j = 3;
  ob.k = 5;

  cout << "Product is " << ob.product() << '\n';

  return 0;
}