Detectando uma função virtual misspelt
-
19-09-2019 - |
Pergunta
Eu fui pego por este problema mais de uma vez:
class A{
public:
virtual ~A() {}
virtual int longDescriptiveName(){ return 0; }
};
class B: public A{
public:
virtual int longDescriptveName(){ return 1; } // Oops
};
Se a função é puro virtual, o compilador captura o erro. Mas se não é este pode ser um erro terrível de rastrear. Parte do problema é que os nomes de função são talvez demasiado longo. Mas eu ainda me pergunto, há uma maneira de ver esses erros antes?
Solução
Uma possibilidade é a função virtual puro, utilizado-pouco com a implementação:
virtual int longDescriptiveName() = 0
{
return 0;
}
Este forças decorrentes classes para substituí-lo. Eles podem, em seguida, chamar a implementação da classe base sozinho, se eles só querem esse comportamento.
Além disso, você precisa ter certeza de sua hierarquia de herança é plana, em vez de multi-camadas, que geralmente é bom de qualquer maneira, porque herança é bastante frágil, sem empilhar nas camadas.
Outras dicas
Se você compilar com Microsoft Visual C ++ 2005 ou mais recente, há um extensão não padrão permitindo que você escreve:
virtual int longDescriptveName() override { return 1; }
E o compilador vai reclamar. Se você também compilar com outros compiladores, seu provavelmente inteligente para fazer um #define para que você possa controlar o comportamento.
questão necro'd Velho, mas uma boa maneira é testar cedo, quer formalmente com testes de unidade, ou, mais informalmente, antes de começar a usar suas classes. Em outras palavras, check-in antecipado em 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);
antes você escrever mais de 10.000 linhas de código que usam suas classes.