1151Fermer1153
azeLe 11/05/2010 à 18:38
la différence concerne le cas où un pointeur vers une classe de base contient l'adresse d'une classe dérivée : dans le cas d'une virtuelle, c'est la méthode du type contenu qui sera appelé, dans une non virtuelle c'est le contenant
class A
{
public:
  virtual void f();
  void g();
};
class B : public A
{
public:
  virtual void f();
  void g();
};


// par pointeur, ça change tout
{
  A* b = new B;
  b->f(); // b::f car b pointe vers B
  b->g(); // a::f car b de type A*
}

// dans le cas de valeurs, pas de surprises
{
  A a;
  B b;
  a.f(); // a::f
  a.g(); // a::g
  b.f(); // b::f
  b.g(); // b::g
}

// les références fonctionnent comme les pointeurs
{
  B b;
  A &a = b;
  a.f(); // b::f
  a.g(); // a::g
}

dans le cas de valeurs, il n'y a pas de type différent pour le conteneur et le contenu donc les virtuelles ne changent rien


une virtuelle pure doit être implémentée par une des classes dérivée avant que tu puisses instancier l'objet
tu n'es pas obligé de l'implémenter directement dans la classe fille, mais ça peut être dans une classe qui hérite de la fille (une classe petite fille)