2010-02-09 4 views
2

J'ai été pris par ce problème plus d'une fois:La détection d'une fonction virtuelle misspelt

class A{ 
public: 
    virtual ~A() {} 
    virtual int longDescriptiveName(){ return 0; } 
}; 

class B: public A{ 
public: 
    virtual int longDescriptveName(){ return 1; } // Oops 
}; 

Si la fonction est virtuelle pure, le compilateur attire l'erreur. Mais si ce n'est pas ce peut être un terrible bug à traquer. Une partie du problème est que les noms de fonctions sont peut-être trop longs. Mais je me demande encore, est-il un moyen de voir ces bugs plus tôt?

Répondre

2

Une possibilité est peu utilisée fonction virtuelle pure mise en œuvre:

virtual int longDescriptiveName() = 0 
{ 
    return 0; 
} 

Cette forces dérivées des classes de préséance. Ils peuvent ensuite appeler l'implémentation de classe de base uniquement s'ils veulent uniquement ce comportement.

Vous devez également vous assurer que votre hiérarchie d'héritage est plate, plutôt que multi-couches, ce qui est généralement bon, car l'héritage est assez fragile sans empiler sur les calques.

1

Si vous compilez avec Microsoft Visual C++ 2005 ou plus récent, il y a une extension non standard vous permettant d'écrire:

virtual int longDescriptveName() override { return 1; } 

Et le compilateur se plaindra. Si vous compilez également avec d'autres compilateurs, il est probablement judicieux de créer un #define pour pouvoir contrôler le comportement.

+0

C'est une extension utile! Mais j'utilise gcc. –

0

Ancienne question nécrosée, mais un bon moyen est de tester tôt, que ce soit formellement avec des tests unitaires, ou de façon plus informelle, avant de commencer à utiliser vos classes. En d'autres termes, vérifiez tôt que:

A test_a; 
B test_b; 
A& poly_a = test_a; 
A& poly_b = test_b; 
assert(poly_a.longDescriptiveName() == 0); 
assert(poly_b.longDescriptiveName() == 1); 

avant vous écrivez 10.000 plus de lignes de code qui utilisent vos classes.