Une partie de notre système utilise la mémoire partagée entre les processus qui ne partagent pas un ancêtre commun. Nous plaçons des objets C++ dans cette mémoire partagée. Les méthodes sur ces objets sont soit en ligne dans les en-têtes, soit hors ligne dans les bibliothèques d'objets qui sont liées aux processus respectifs.De toute façon en C++ pour une classe de base pour interdire les méthodes virtuelles dans toutes les classes dérivées?
Une erreur fréquemment faite par les nouveaux venus dans le système est d'introduire une méthode virtuelle quelque part. Ceci est garanti pour planter le système car il n'y a aucun moyen de s'assurer que le VT (table virtuelle) réside à la même adresse dans chaque processus.
Je me demande donc s'il existe un moyen pour que le compilateur génère une erreur si quelqu'un tente d'introduire une méthode virtuelle. Quelque chose de similaire à rendre les constructeurs de copie et d'affectation privés pour interdire la sémantique de la copie.
La réponse n'est pas de placer des objets C++ dans la mémoire partagée - cela se termine toujours en larmes. Mettez les données brutes dans la mémoire partagée - pas les objets. –
@Neil - Mais Boost.Interprocess est tellement cool ... –
@Neil - c'est un "jetons le bébé avec l'eau du bain" attitude.La révocation du polymorphisme basé sur VT ne rend pas les objets C++ inutiles. Et le coût d'avoir à enseigner à un débutant les implications de la mémoire partagée pâlit devant la complexité supplémentaire que nous aurions à supporter pour n'avoir que des données brutes dans la mémoire partagée. –