- Je les utiliser pour permettre aux classes dérivées pour "combler les vides" pour une classe de base sans s'exposer à de tels trous pour les utilisateurs finaux. Par exemple, j'ai très dynamique des objets provenant d'une base commune, qui ne peut mettre en œuvre des 2/3 de l'ensemble de la machine d'état (les classes dérivées de fournir le 1/3 restant, selon un argument de modèle, et la base ne peut pas être un modèle pour d'autres raisons).
J'ai BESOIN d'avoir la classe de base commune afin de faire beaucoup de l'Api publiques de fonctionner correctement (je suis en utilisant variadic templates), mais je ne peux pas laisser cet objet dans la nature. Pire, si je laisse les cratères de la machine d'état, sous la forme de fonctions virtuelles pures - n'importe où, mais dans le "Privé", je laisse un savant ou ignorant, l'utilisateur découlant de l'un de ses enfants des classes de remplacer les méthodes que les utilisateurs ne doivent jamais se toucher. Alors, j'ai mis la machine d'état 'cerveaux' en PRIVÉ des fonctions virtuelles. Puis les enfants immédiats de la classe de base de remplir les blancs sur leur NON-virtuel remplace, et les utilisateurs peuvent utiliser en toute sécurité les objets ou créer leurs propres classes dérivées sans se soucier de perturber le fonctionnement de la machine d'état.
Comme pour l'argument que vous ne devriez pas AVOIR de public de méthodes virtuelles, je dis BS. Les utilisateurs peuvent mal l'emportent sur les virtuals aussi facilement que celles du public - qu'ils sont de définir de nouvelles classes, après tout. Si le public ne devrait pas modifier une API, ne pas en faire virtuel À TOUS de rendre accessible au public des objets.