L'idée est la suivante. J'ai une bibliothèque version 1 avec une classe qui se présente comme suit:C++ Héritage et bibliothèques dynamiques
class MY_EXPORT MyClass
{
public:
virtual void myMethod(int p1);
}
Dans la version 2, la classe a été modifiée à ceci:
class MY_EXPORT MyClass
{
public:
virtual void myMethod(int p1);
virtual void myMethod2(int p1, int p2);
}
//implementation of myMethod2 in cpp file
void MyClass::myMethod2(int p1, int p2)
{
myMethod(p1);
//...
}
Maintenant, imaginez un utilisateur compilé againts version 1 de la bibliothèque et étendu MyClass
en remplaçant myMethod
. Maintenant, il met à jour la bibliothèque à la version 2, sans recompilation. Supposons en outre que l'éditeur de liens dynamiques trouve toujours la bibliothèque avec succès et la charge.
La question est, si j'appelle la méthode instance->myMethod2(1, 2);
quelque part dans la bibliothèque, cela fonctionnera-t-il, ou l'application plantage? Dans les deux cas, la classe n'a pas de membres et est donc de la même taille.
Puisque la classe héritée ne connaît pas l'interface modifiée, elle n'aura aucune information à son sujet dans sa table virtuelle. Cela conduira à un * comportement indéfini *. En bref: Si l'interface change, les applications en fonction de ces interfaces doivent être recompilées. –