Constructeur jamais virtuel

Fermé
saranaj - 10 janv. 2009 à 10:41
 Mohamed - 12 déc. 2017 à 13:19
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
A voir également:

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
bonjour

la 2me question c'est pourquoi c'est dangereux d'utiliser le constructeur synthétisé par le compilateur ?
0
loupius > saranaj
11 janv. 2009 à 11:52
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.
0
togodo Messages postés 148 Date d'inscription vendredi 19 septembre 2008 Statut Membre Dernière intervention 19 août 2009 8 > loupius
11 janv. 2009 à 12:09
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 :)
0
Merci beaucoup, c'est super bien expliqué ;-)
0
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?
0
togodo Messages postés 148 Date d'inscription vendredi 19 septembre 2008 Statut Membre Dernière intervention 19 août 2009 8
11 janv. 2009 à 16:11
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
0