2011-08-17 1 views
4

Le qualificateur virtuel à une fonction virtuelle de classe de base, dans la classe dérivée fait-il une différence?qualificateur virtuel dans la classe dérivée

class b 
{ 
    public: 
    virtual void foo(){} 
}; 

class d : public b 
{ 
    public: 
    void foo(){ .... } 
}; 

ou

class d : public b 
{ 
    public: 
    virtual void foo(){ .... } 
}; 

est-il une différence dans ces deux déclarations, à part qu'il fait enfant de prendre conscience d virtualité de foo()?

+0

afaik, cela fait la différence si quelque chose d'autre dérive de la classe d –

+0

@Kshitij: Non, même dans ce cas, cela ne fait aucune différence. Une fois que 'foo' est virtuel, c'est virtuel pour toujours, peu importe à quelle distance vous allez de la base dans la hiérarchie des classes. – Nawaz

Répondre

2

Aucune différence - c'est un remplacement virtuel de toute façon.

Il est une question de style et a été définitivement discuté here

1

Il est préférable d'inclure le style le mot-clé virtuel. Mais ce n'est pas obligatoire.

5

Cela ne fait aucune différence. foo est virtuel dans toutes les classes dérivées de b (et leurs descendants).

Du standard C++ 03, §10.3.2:

Si une vf fonction membre virtuel est déclarée dans une classe de base et dans une classe dérivée, dérivée directement ou indirectement de la base, une fonction membre vf avec le même nom et la même liste de paramètres que Base :: vf est déclaré, alors Derived :: vf est aussi virtuel (qu'il soit ou non ainsi déclaré) et il surcharge Base :: vf.

1

Aucune différence.

Une fois foo est virtuel, son virtuel à jamais dans la hiérarchie des classes, peu importe comment vous allez loin de la base dans la hiérarchie des classes.

Mais je préfère écrire virtual même dans les fonctions surchargées, car il ajoute lisibilité au code, ce qui compte beaucoup.

+0

Pour plus de sécurité C++ 11 ajoute un mot-clé override que vous pouvez spécifier, ainsi le compilateur vérifie que lorsque vous surchargez une fonction virtuelle, vous n'avez pas fait d'erreur dans la signature et l'avez surchargé accidentellement – PlasmaHH

Questions connexes