Question

J'ai été pris par ce problème plus d'une fois:

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, cela peut être un terrible bug pour traquer. Une partie du problème est que les noms de fonction sont peut-être trop long. Mais je me demande encore, est-il possible de voir ces bugs plus tôt?

Était-ce utile?

La solution

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

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

forces dérivées des classes de préséance. Ils peuvent ensuite appeler la mise en œuvre de classe de base seulement si elles veulent que ce comportement.

Aussi, vous devez vous assurer que votre hiérarchie d'héritage est plat, plutôt que multi-couches, ce qui est généralement bien quand même parce que l'héritage est assez fragile sans empiler les couches.

Autres conseils

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 aussi avec d'autres compilateurs, il est probablement intelligent pour faire une #define afin que vous puissiez contrôler le comportement.

question Old necro'd, mais une bonne façon est de tester tôt, soit formellement avec les 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 lignes de code qui utilisent vos classes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top