Rilevare una funzione virtuale misspelt
-
19-09-2019 - |
Domanda
Sono stato preso da questo problema più di una volta:
class A{
public:
virtual ~A() {}
virtual int longDescriptiveName(){ return 0; }
};
class B: public A{
public:
virtual int longDescriptveName(){ return 1; } // Oops
};
Se la funzione è pura virtuale, il compilatore rileva l'errore. Ma se non è questo può essere un terribile errore da rintracciare. Parte del problema è che i nomi delle funzioni sono forse troppo a lungo. Ma mi chiedo ancora, c'è un modo di vedere questi bug in precedenza?
Soluzione
Una possibilità è la funzione virtuale pura poco utilizzata con l'implementazione:
virtual int longDescriptiveName() = 0
{
return 0;
}
Questa forze derivanti classi per ignorarlo. Essi possono quindi chiamare l'implementazione della classe base da soli se vogliono solo che il comportamento.
Inoltre è necessario assicurarsi che la vostra gerarchia di ereditarietà è piatta, piuttosto che multi-strati, che è generalmente buono in ogni caso, perché l'ereditarietà è fragile abbastanza senza accumulare strati.
Altri suggerimenti
Se si compila con Microsoft Visual C ++ 2005 o più recente, v'è una estensione non standard consente di scrivere:
virtual int longDescriptveName() override { return 1; }
E il compilatore si lamenterà. Se si compila anche con altri compilatori, la sua, probabilmente intelligente per fare un # define in modo da poter controllare il comportamento.
Old domanda necro'd, ma un buon modo è quello di testare in anticipo, sia formalmente con test di unità, o più informale, prima di usare le classi. In altre parole, controllare subito che:
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);
prima si scrive 10.000 più righe di codice che utilizzano le classi.