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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top