Constructeur jamais virtuel [Fermé]

Signaler
-
 Mohamed -
Bonjour,en c++
Pourquoi un constructeur n'est jamais virtuel,et sachant toujours un constructeur estsynthétisé par le compilateur (peut-être dangereux)?


Aussi Pourquoi L’utilisation de « this » est parfois réellement indispensable

2 réponses

Un constructeur ne peut pas être virtuel, c'est logique: la virtualité installe le polymorphisme, donc si un constructeur pouvait être virtuel, il ne serait pas appellé lors de l'instantiation d'une classe dérivée... et en conséquence la partie classe mère ne serait pas pris en compte, c'est la cata!
Je ne comprends pas trop la partie:sachant toujours un constructeur estsynthétisé par le compilateur (peut-être dangereux).
Utilisation de 'this' indispensable ?
A priori, je n'ai pas de réponse.
Je l'ai jadis utilisé dans les constructeurs du type:
ClasseExemple
{
  public:
    ClasseExemple(int a, int b) { this->a = a; this->b = b; }
    ...
  private:
    int a,b;
}
On est obligé d'utiliser 'this' car le paramètre à le même nom qu'un membre de la classe.
Un autre cas spécifique, pour moi, est l'utilisation avec Qt de la fonction 'connect'.
5
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

bonjour

la 2me question c'est pourquoi c'est dangereux d'utiliser le constructeur synthétisé par le compilateur ?
> saranaj
Le constructeur synthétisé... tu veux sans doute parler du constructeur par défaut.
Il n'est pas du tout dangereux de l'utiliser (ou plutôt de le laisser utiliser par défaut), mais il faut savoir que ce constructeur fera le minimum, c'est-à-dire qu'il va simplement allouer de l'espace pour les variables sans les initialiser (sauf pour les statiques et les globales); c'est la raison pour laquelle, en général, on définit un constructeur qui va donner une valeur aux variables et donner aux pointeurs une correcte allocation mémoire.
Messages postés
148
Date d'inscription
vendredi 19 septembre 2008
Statut
Membre
Dernière intervention
19 août 2009
8 > loupius
C'est surtout au niveau du constructeur de copie,si ta classe contient des pointeurs.

Lors de la construction par copie, le nouvelle objet va allouer les même adresses que l'objet qu'il copie,
et dès lors les composants seront liés ce qui n'est pas voulu.
Donc en bref si tu as des pointeurs il faut changer tes constructeurs.
Ca rime en plus :)
Merci beaucoup, c'est super bien expliqué ;-)
merci togodo c'est ca , le probleme est que si la classe contient des pointeurs,le constructeur par défaut ne poura pas copier les adresses ou pointent les pointeurs c'est bien ca?
Messages postés
148
Date d'inscription
vendredi 19 septembre 2008
Statut
Membre
Dernière intervention
19 août 2009
8
Exemple :
1 objet "v1" de la classe V contient un pointeur char *a = new char[15];
Si tu instancies un objet v2 par le constructeur de copie tu auras.
V v1=new V();
V v2=v1;

Si tu as le constructeur par défaut.
v2.a=v1.a

Or a dans ce cas "v2.a" est une adresse (car c'est un pointeur), donc v2.a sera lié à la même adresse que v1.a.
Ce qui veux dire que si tu changes la valeur de v1.(*a) cela change aussi la valeur de v2.(*a) car la variable est stocké à la même adresse.
LE siteduzero explique bien cela il me semble...

Va voir sur https://openclassrooms.com/fr/courses/1894236-programmez-avec-le-langage-c#ss_part_3