2014-06-18 1 views
2

En utilisant la version gcc 4.8.2:qualificatif const disparaît de la fonction virtuelle pure

Je suis en cours d'exécution dans un problème où le qualificatif const sur mes paramètres est en train de disparaître quand je compile mon code. Voici un exemple:

main.cc:

#include <iostream> 

class Base 
{ 
     public: 
     virtual int getSum(const int number) = 0; 
}; 

class Derived : public Base 
{ 
     public: 
     Derived(const int& num) 
     : _myNumber(num) 
     {} 

     virtual int getSum(const int number) 
     { 
       return _myNumber + number; 
     } 

     private: 
     int _myNumber; 
}; 

int main(int argc, const char* argv[]) 
{ 
     Base *b = new Derived(2); 

     std::cout << b->getSum(3) << "\n"; 

} 

compilée par:

g++ main.cc -o const_test 

Quand je lance nm:

nm const_test | c++filt | grep getSum 

Je reçois la sortie suivante:

0000000000400b60 W Derived::getSum(int) 

Pourquoi le const disparaît-il de ma fonction lors de la compilation?

+4

@ πάνταῥεῖ Plus précisément, il * a * une signification (à l'intérieur de la fonction) mais il ne fait pas partie de la signature. –

+1

@Konrad Rudolph Ecrivez cela comme une réponse. –

+0

Il s'agit d'une règle de langage, les qualificatifs cv sur les arguments de fonction sont ignorés pour la résolution de surcharge. Section 13.1 de la spécification de langage C++. –

Répondre

4

Votre signature de la fonction

virtual int getSum(const int number) = 0; 

est en fait exactement équivalente à

virtual int getSum(int number) = 0; 

const n'a pas d'effet sur la déclaration de signature de la fonction des paramètres passés par valeur.

Le seul effet est que vous ne pouvez pas modifier l'instance de paramètre sur la pile dans une définition de potentiel de cette méthode. Il suffit en fait de le mettre uniquement là, pour éviter de changer l'instance du paramètre dans le corps de la fonction.

+0

Il pourrait être utile d'ajouter que ce qui compte est la signature dans la définition de la fonction. Vous avez mentionné que les deux signatures sont identiques, mais parfois les gens ne comprennent pas les implications de cela. – juanchopanza

+0

@juanchopanza THX pour souligner, j'ai essayé de clarifier un peu. –

Questions connexes