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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top