Erreur de compilation ? Non. Il ne peut y avoir de problème que si ta deuxième et troisième classe ont une méthode avec le même prototype et que ta dernière classe ne la redéfinit pas, car cette méthode sera alors ambigue.
Erreur de logique ? Ca dépend de ton programme et de ce que tu veux faire. Si tu le fais correctement, non.
Si une classe donnée a des méthodes virtuelles, alors
1) Ton programme créé pour ce type de classe un tableau contenant les adresses mémoires des méthodes virtuelles en question (et/ou des méthodes virtuelles héritées si elles n'ont pas été redéfinies). C'est ce que l'on appelle la TMV (Table des Méthodes Virtuelles) ou VMT en Anglais.
2) chaque instance de cette classe possède un pointeur sur cette TMV. Lorsque tu appelles une méthode donnée sur une instance, ton programme va en fait accéder à la TMV, y lire l'adresse de la méthode à appeler et l'exécuter.
Exemple :
Classe A avec méthode virtuelle v.
Classe B héritant de A et redéfinissant v
Classe C héritant de A et redéfinissant v
Classe D héritant de B et C et redéfinissant v
A* a1 = new A;
A* a2 = new B;
A* a3 = new C;
A* a4 = new D; // Il faudra probablement caster en C* ou B* auparavant.
a1->v(); // Appelle A::v
a2->v(); // Appelle B::v
a3->v(); // Appelle C::v
a4->v(); // Appelle D::v
Alors que si v n'était pas virtuelle, les 4 appels auraient exécuter A::v.
Message édité par tfpsly le 21-08-2006 à 18:43:57