Question

J'ai une bibliothèque qui peut être compilé en tant que bibliothèque partagée (ou DLL dans Windows). Il a une classe qui est dérivée d'une autre classe dans une autre bibliothèque. La classe de base a des méthodes virtuelles et ma classe l'emporte sur certains d'entre eux. Par exemple:

class Base {
public:
    virtual void method1();
    virtual void method2();
    virtual void method3();
};

class Derived: public Base {
public:
    virtual void method2();
};

Maintenant, je me suis dit que l'une des méthodes virtuelles ne fonctionne pas tout à fait pour ma classe. À l'heure actuelle, il ne remplace pas cette méthode, je veux l'emporter aussi pour corriger son comportement:

class Derived: public Base {
public:
    virtual void method2();
    virtual void method3();
};

Est-ce que cette compatibilité binaire rupture avec les anciennes versions de ma bibliothèque?

Pour autant que je le comprends, il est différent de simplement ajouter des fonctions virtuelles, comme le nombre et l'ordre des méthodes virtuelles dans les séjours vtable les mêmes. La seule différence est qu'une entrée particulière dans le vtable pour ma classe contient maintenant une valeur différente. Est-ce exact?

Je suis aussi tout à fait sûr qu'aucune des applications utilisant actuellement mon utilisation de la bibliothèque que la méthode, car il est complètement cassé et ne fonctionne jamais. Donc, je ne suis pas se soucier de briser les appels existants à la mise en œuvre de la méthode de base. Je veux juste vous assurer que je ne casserez rien d'autre.

Était-ce utile?

La solution

Puisque vous parlez de DLL, je suppose que c'est C ++ dans Visual Studio / Windows. Ajout de la commande prioritaire ne cassera pas la compatibilité binaire parce que la taille de la vtable ne change pas. Cependant, il peut provoquer des résultats indésirables si vous ne recompilez pas tout le code qui instancie les nouvelles instances de dérivés. En effet, le vtable est initialisé par la source d'instanciation, pas la source de la classe qui implémente DÉRIVÉS.

Autres conseils

Si je comprends bien, vous avez votre classe de base dans DLL1 et votre classe dérivée DLL2. Si tel est le cas, le changement que vous décrivez n'affecte pas DLL1. En supposant que vous allez installer une mise à jour DLL2 votre application basculera appeler Derived :: MÉTHODE3 () chaque fois que vous accédez à des instances de pointeurs ou dérivée par des références à la base.

La bibliothèque de votre classe dérivée (qui a ajouté la nouvelle méthode virtuelle) existe dans la volonté pas nécessairement être binaire (ABI) compatible avec l'ancienne version de la bibliothèque. Ceci est parce que vous avez aucun contrôle sur la façon dont le vtable est généré par le compilateur lorsque vous ajoutez la méthode virtuelle surchargée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top