Funcții virtuale

O funcție virtual poate fi suprascrisă în clasele derivate. Dispatch-ul virtual decide la runtime (nu la compilare) ce versiune se apelează.

class Animal {
public:
  virtual void sunet() { cout << "..." << endl; }
  virtual ~Animal() {}  // destructor virtual — obligatoriu!
};

class Pisica : public Animal {
public:
  void sunet() override { cout << "Miau!" << endl; }
};

class Caine : public Animal {
public:
  void sunet() override { cout << "Ham!" << endl; }
};

Animal* a = new Pisica();
a->sunet();   // "Miau!" (polimorfism)
delete a;

Clasă abstractă — funcție pur virtuală

class Forma {
public:
  virtual double arie() = 0;  // pur virtuală (= 0)
  // Forma nu poate fi instanțiată direct
};
Dacă o clasă are cel puțin o funcție pur virtuală, este abstractă și nu poate fi instanțiată direct.