Héritage
Exemple de déclaration
#include <iostream>
#include <vector>
using namespace std;
class Animal
{
private:
int legs;
public:
virtual void parler()
{
cout << "je sais pas parler car je suis un animal générique" << endl;
}
};
class Chat : public Animal
{
private:
int vibrissae = 6;
public:
void parler()
{
cout << "miaou" << vibrissae << endl;
i++;
}
};
class Crapaud : public Animal
{
public:
void parler()
{
cout << "crooaaaa" << endl;
}
};
Programme qui ne fonctionne pas bien
int main()
{
vector<Animal> S;
S.push_back(Chat());
S.push_back(Crapaud());
for (Animal &a : S)
{
a.parler();
}
}
Sans pointeurs, pas possible de faire du polymorphisme de sous-typage. En effet, quand on met dans une zone mémoire pour un Animal
, ce qui dépasse (propre à Cat
ou Frog
) est juste rogné. Donc on ne peut pas appliquer des méthodes de Cat
qui ne vont pas trouver les données propres à un chat. Bref, on a vraiment que des objets de la classe Animal
.
Programme qui fonctionne mais bon...
En C++, on peut utiliser des pointeurs à l'ancienne et ça marche.
int main()
{
vector<Animal*> S;
S.push_back(new Chat());
S.push_back(new Crapaud());
for (Animal*& a : S)
{
a->parler();
}
}
Programme chouette
#include <memory.h>
int main()
{
vector< shared_ptr<Animal> > S;
S.push_back(shared_ptr<Animal>(new Chat()));
S.push_back(shared_ptr<Animal>(new Crapaud()));
for (shared_ptr<Animal>& a : S)
{
a->parler();
}
}
Virtual method table
C++ creates a table for each class containing a pointer for each method declared as virtual
. It is called a virtual method table (or vtable, or VMT). Then each object starts with a pointer to the appropriate virtual method table.
Virtual method tables are built at compile-time and solely contains virtual methods. Non-virtual methods are just called directly, without any look-up in a vtable.