Comment concevoir une API C++ pour compatible binaire extensibilité

Je suis en train de concevoir une API pour une bibliothèque C++ qui sera distribué dans une dll /objet partagé. La bibliothèque contient polymorhic classes avec des fonctions virtuelles. Je crains que si j'expose ces fonctions virtuelles sur l'API DLL, j'ai coupé moi-même de la possibilité d'étendre les mêmes classes avec plus de fonctions virtuelles sans casser la compatibilité binaire avec les applications développées pour la version précédente de la bibliothèque.

Une option serait d'utiliser le PImpl idiome pour masquer toutes les classes ayant des fonctions virtuelles, mais qui semble aussi avoir ses limites: de cette façon, les applications de perdre la possibilité de dériver les classes de la bibliothèque et en remplaçant les méthodes virtuelles.

Comment voulez-vous concevoir une classe de l'API qui peut être sous-classé dans une application, sans perdre la possibilité d'étendre l'API avec (non pas abstraite) des méthodes virtuelles dans une nouvelle version de la dll, tout en restant en arrière compatible binaire?

Mise à jour: les plates-formes cibles pour la bibliothèque sont windows/msvc et linux/gcc.

InformationsquelleAutor shojtsy | 2009-11-21