Une méthode d'objet peut être déclarée virtuelle grâce au mot clé virtual. Ainsi, toute redéfinition de cette méthode sera aussi considéré comme virtuelle.
Si une méthode est virtuelle, lors de son appel, le choix de la méthode dépend du type de l'objet. Ce choix est fait pendant l'execution.
class A{
public:
virtual void g(){cout<<"A::gv ";}
void g(int){cout<<"A::gi ";}
};
class B : public A{
public:
void g(){cout<<"B::gv ";} //virtuelle aussi
void g(int){cout<<"B::gi ";}
};
int main(){
B obj;
A* p = &obj;
A& r = obj;
p->g(3); //A::gi
p->g(); //B::gv
r.g(3); //A::gi
r.g(); //B::gv
Si la méthode est virtuelle, on regarde le type de l'objet pointé, sinon on regarde le type du pointeur.