Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2016-04-15T15:32:31+02:00Les derniers messages parus sur le forum de Zeste de Savoir.Fonction virtuel et classe fille, message #1061012016-04-15T15:32:31+02:00Maluna34/@Maluna34https://zestedesavoir.com/forums/sujet/5820/fonction-virtuel-et-classe-fille/?page=1#p106101<p>Il permet également au compilateur de spécifier que la méthode en question doit redéfinir une méthode, et donc de générer une erreur si ça n'était pas le cas.</p>Fonction virtuel et classe fille, message #1061002016-04-15T15:04:04+02:00Vael/@Vaelhttps://zestedesavoir.com/forums/sujet/5820/fonction-virtuel-et-classe-fille/?page=1#p106100<p>Nickel merci !</p>
<p>Si j'ai bien compris <code>override</code> est juste la pour informer le prochain humain qui passe dan le programme que l'on modifie une fonction virtuel et pour aider lors des erreurs de compilation.</p>Fonction virtuel et classe fille, message #1060922016-04-15T14:17:44+02:00Ksass`Peuk/@Ksass%60Peukhttps://zestedesavoir.com/forums/sujet/5820/fonction-virtuel-et-classe-fille/?page=1#p106092<p>(Donc : toujours utiliser override quand on crée une redéfinition de fonction membre virtuelle).</p>Fonction virtuel et classe fille, message #1060902016-04-15T14:07:08+02:00Praetonus/@Praetonushttps://zestedesavoir.com/forums/sujet/5820/fonction-virtuel-et-classe-fille/?page=1#p106090<p>Salut.</p>
<p>Pour <code>virtual</code>, aucune différence. Une fonction virtuelle dans une classe mère l'est automatiquement dans une classe fille si celle-ci redéfinit la fonction. Là où ça pose une différence, c'est avec le spécificateur <code>override</code>. Si une fonction déclarée <code>override</code> dans une classe fille n'est pas déclarée et virtuelle dans une classe mère, cela provoque une erreur de compilation.</p>Fonction virtuel et classe fille, message #1060892016-04-15T14:02:02+02:00Vael/@Vaelhttps://zestedesavoir.com/forums/sujet/5820/fonction-virtuel-et-classe-fille/?page=1#p106089<p>Bonjour,</p>
<p>C'est une petite demande d’éclaircissement.
Lorsqu'il y a une classe fille qui dérivent d'une classe elle même fille, on voit parfois que les fonctions virtuels de la classe mère sont toujours ré-definie comme virtuel dans les classes filles, petites-filles etc.</p>
<p>exemple :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="k">class</span> <span class="nc">A</span>
<span class="p">{</span>
<span class="k">public</span><span class="o">:</span>
<span class="k">virtual</span> <span class="kt">void</span> <span class="n">f</span><span class="p">()</span> <span class="p">{</span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="o"><<</span><span class="s">"A"</span><span class="o"><<</span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;}</span>
<span class="p">};</span>
<span class="k">class</span> <span class="nc">B</span><span class="o">:</span> <span class="k">public</span> <span class="n">A</span>
<span class="p">{</span>
<span class="k">public</span><span class="o">:</span>
<span class="k">virtual</span> <span class="kt">void</span> <span class="n">f</span><span class="p">()</span> <span class="p">{</span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="o"><<</span><span class="s">"B"</span><span class="o"><<</span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;}</span>
<span class="p">};</span>
<span class="k">class</span> <span class="nc">C</span><span class="o">:</span> <span class="k">public</span> <span class="n">B</span>
<span class="p">{</span>
<span class="k">public</span><span class="o">:</span>
<span class="k">virtual</span> <span class="kt">void</span> <span class="n">f</span><span class="p">()</span> <span class="p">{</span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="o"><<</span><span class="s">"C"</span><span class="o"><<</span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;}</span>
<span class="p">};</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
<span class="n">B</span> <span class="n">b</span><span class="p">;</span>
<span class="n">C</span> <span class="n">c</span><span class="p">;</span>
<span class="n">A</span> <span class="o">*</span> <span class="n">pab</span> <span class="o">=</span> <span class="o">&</span><span class="n">b</span><span class="p">;</span>
<span class="n">A</span> <span class="o">*</span> <span class="n">pac</span> <span class="o">=</span> <span class="o">&</span><span class="n">c</span><span class="p">;</span>
<span class="n">B</span> <span class="o">*</span> <span class="n">pbc</span> <span class="o">=</span> <span class="o">&</span><span class="n">c</span><span class="p">;</span>
<span class="n">pab</span><span class="o">-></span><span class="n">f</span><span class="p">();</span>
<span class="n">pac</span><span class="o">-></span><span class="n">f</span><span class="p">();</span>
<span class="n">pbc</span><span class="o">-></span><span class="n">f</span><span class="p">();</span>
<span class="p">}</span>
</pre></div>
</td></tr></table>
<p>Or si j’enlève le "virtual" dans les classes B et C ça ne change pas le résultat du code.</p>
<p>Y a-t-il une raison de mettre ce "virtual" ? </p>
<p>J'en voie une : rappeler au développeur qui gère une sous-sous-sous-etc classe que la fonction d'origine est virtuel. Mais y a-t-il une raison plus technique ?</p>