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
contenantclass 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)