Pourquoi le C++ n'a-t-il pas de constructeur virtuel ?
Réponses
Trop de publicités?Écoutez-le de la bouche du cheval :).
Extrait de la FAQ sur le style et la technique C++ de Bjarne Stroustrup Pourquoi n'avons-nous pas de constructeurs virtuels ?
Un appel virtuel est un mécanisme permettant de réaliser un travail à partir d'informations partielles. En particulier, "virtuel" nous permet d'appeler une fonction en ne connaissant que les interfaces et non le type exact de l'objet. Pour créer un objet, il faut disposer d'informations complètes. En particulier, vous En particulier, il faut connaître le type exact de ce que l'on veut créer. Par conséquent, un "appel à un constructeur" ne peut pas être virtuel.
L'entrée de la FAQ donne ensuite le code permettant d'atteindre cet objectif sans constructeur virtuel.
Les fonctions virtuelles fournissent essentiellement un comportement polymorphe. En d'autres termes, lorsque vous travaillez avec un objet dont le type dynamique est différent du type statique (au moment de la compilation) auquel il est référencé, il fournit un comportement approprié pour l'objet. réel de l'objet au lieu du type statique de l'objet.
Essayez maintenant d'appliquer ce genre de comportement à un constructeur. Lorsque vous construisez un objet, le type statique est toujours le même que le type réel de l'objet :
Pour construire un objet, un constructeur a besoin du type exact de l'objet qu'il doit créer [...] De plus [...] vous ne pouvez pas avoir un pointeur vers un constructeur.
(Bjarne Stroustup (P424 The C++ Programming Language SE))
Contrairement aux langages orientés objet tels que Smalltalk ou Python, où le constructeur est une méthode virtuelle de l'objet représentant la classe (ce qui signifie que vous n'avez pas besoin de la fonction GoF modèle de fabrique abstraite En revanche, le C++ est un langage basé sur les classes et ne possède pas d'objets représentant les constructions du langage. La classe n'existe pas en tant qu'objet au moment de l'exécution, vous ne pouvez donc pas appeler une méthode virtuelle sur elle.
Cela correspond à la philosophie "vous ne payez pas pour ce que vous n'utilisez pas", bien que tous les grands projets C++ que j'ai vus aient fini par mettre en œuvre une forme de fabrique abstraite ou de réflexion.
Deux raisons auxquelles je peux penser :
Raison technique
Pour que le constructeur soit distribué en utilisant la table virtuelle, il faut qu'il y ait un objet existant avec un pointeur vers la table virtuelle, mais comment un pointeur vers la table virtuelle peut-il exister si l'objet n'existe pas encore ?)
Raison logique
On utilise le mot-clé virtual lorsque l'on veut déclarer un comportement quelque peu polymorphe. Mais il n'y a rien de polymorphe avec les constructeurs, le rôle des constructeurs en C++ est simplement de placer les données d'un objet dans la mémoire. Puisque les tables virtuelles (et le polymorphisme en général) concernent le comportement polymorphe plutôt que les données polymorphes, il n'y a aucun sens à déclarer un constructeur virtuel.