Peut-fonctions virtuelles des paramètres par défaut?
Si je déclare une classe de base (ou l'interface de la classe) et de spécifier une valeur par défaut pour un ou plusieurs de ses paramètres, effectuez les classes dérivées doivent spécifier le même défaut et si non, qui par défaut se manifeste dans les classes dérivées?
Addendum: je suis aussi intéressé par la façon dont cela peut être géré à travers différents compilateurs et des commentaires sur "recommandé" de la pratique dans ce scénario.
- Cela semble une chose facile à tester. Avez-vous essayé?
- Je suis en train de l'essayer mais je n'ai pas trouvé de renseignements concrets de la façon dont "défini" le comportement serait donc j'ai finit par trouver une réponse à mon compilateur spécifique, mais qui ne me dites pas si tous les compilateurs fera la même chose. Je suis aussi intéressé par la pratique recommandée.
- Le comportement est bien définie, et je doute que vous trouverez un compilateur qui est faux (enfin, peut-être que si vous testez gcc 1.x, ou VC++ 1.0 ou quelque chose comme ça). La pratique recommandée est contre cela.
Vous devez vous connecter pour publier un commentaire.
Virtuals peuvent avoir des valeurs par défaut. Les valeurs par défaut dans la classe de base ne sont pas héritées par les classes dérivées.
Qui par défaut est utilisée, c'est à dire, la classe de base ou d'une classe dérivée' -- est déterminé par le type statique utilisé pour faire l'appel à la fonction. Si vous appelez par l'intermédiaire d'un objet de classe de base, pointeur ou de référence, la valeur par défaut indiqué dans la classe de base est utilisé. A l'inverse, si vous l'appelez par l'intermédiaire d'un objet de classe dérivée, pointeur ou de référence, les valeurs par défaut indiqué dans la classe dérivée sont utilisés. Il y a un exemple en dessous de la Norme citation qui illustre cela.
Certains compilateurs peuvent faire quelque chose de différent, mais c'est ce que le C++03 et C++11 Normes de dire:
(MODIFIER: Le C++11 Standard dit exactement la même chose)
8.3.6.10:
Modifier Voici un exemple de programme pour démontrer que les valeurs par défaut sont ramassés. Je suis en utilisant
struct
s ici plutôt que declass
es tout simplement pour des raisons de concision --class
etstruct
sont exactement les mêmes dans presque tous les sens, sauf défaut de visibilité.La sortie de ce programme (sur MSVC10 et GCC 4.4) est:
C'était le sujet de l'un de Herb Sutter début de Gourou de la Semaine postes.
La première chose qu'il dit sur le sujet est de NE PAS le FAIRE.
Plus en détail, oui, vous pouvez spécifier différents paramètres par défaut. Ils ne fonctionnent pas de la même façon que les fonctions virtuelles. Une fonction virtuelle est appelée sur le type dynamique de l'objet, tandis que les valeurs de paramètre par défaut sont basées sur le type statique.
Donné
vous devriez obtenir
A::toto1
B::foo2
B::toto1
C'est quelqu'un que vous pouvez probablement comprendre raisonnablement bien par des essais (par exemple, il est suffisamment mainstream partie de la langue que la plupart des compilateurs presque certainement obtenir ce droit et, sauf si vous voyez des différences entre les compilateurs, leur production peut être considéré comme assez bien faisant autorité).
C'est une mauvaise idée, car la valeur par défaut des arguments que vous recevrez dépendra de la statique type de l'objet, tandis que les
virtual
fonction distribué aux dépendra de la dynamique type.C'est-à-dire, lorsque vous appelez une fonction avec des arguments par défaut, la valeur par défaut arguments sont substitués au moment de la compilation, indépendamment du fait que la fonction est
virtual
ou pas.@cppcoder offert l'exemple suivant, dans son [fermé] question:
Qui produit la sortie suivante:
Avec l'aide de l'explication ci-dessus, il est facile de voir pourquoi. Au moment de la compilation, le compilateur remplace la valeur par défaut des arguments de l'fonctions de membre de la statique des types de pointeurs, de faire son
main
fonction équivalente à la suivante:Comme vous pouvez le voir dans les autres réponses de ce sujet est compliqué. Au lieu d'essayer de faire ceci ou de comprendre ce qu'il fait (si vous vous posez maintenant, le responsable devra demander ou rechercher un an à partir de maintenant).
Au lieu de cela, créer un public de non-fonction virtuelle dans la classe de base avec les paramètres par défaut. Ensuite, il appelle un privé ou protégé fonction virtuelle qui n'a pas de paramètres par défaut et il est remplacé dans les classes enfant en tant que de besoin. Ensuite, vous n'avez pas à vous soucier de la question de savoir comment il fonctionne et le code est très évident.
Comme d'autres réponses détaillées, sa mauvaise idée. Cependant, puisque personne ne parle de la solution simple et efficace, elle est ici: Convertir vos paramètres de structure et alors vous pouvez avoir des valeurs par défaut pour les membres de la structure!
Ainsi, au lieu de,
ce faire,