Eu tenho uma classe base com uma função virtual e quero substituir essa função em uma classe derivada. Existe alguma maneira de fazer o compilador verificar se a função que declarei na classe derivada realmente substitui uma função na classe base? Gostaria de adicionar alguma macro ou algo que garanta que eu não declarei acidentalmente uma nova função, em vez de substituir a antiga.
Veja este exemplo:
class parent {
public:
virtual void handle_event(int something) const {
// boring default code
}
};
class child : public parent {
public:
virtual void handle_event(int something) {
// new exciting code
}
};
int main() {
parent *p = new child();
p->handle_event(1);
}
Aqui parent::handle_event()
é chamado em vez de child::handle_event()
, porque o método da criança perde a const
declaração e, portanto, declara um novo método. Isso também pode ser um erro de digitação no nome da função ou alguma pequena diferença nos tipos de parâmetros. Também pode acontecer facilmente se a interface da classe base mudar e em algum lugar alguma classe derivada não foi atualizada para refletir a mudança.
Existe alguma maneira de evitar esse problema, posso de alguma forma dizer ao compilador ou alguma outra ferramenta para verificar isso para mim? Quaisquer sinalizadores de compilador úteis (de preferência para g ++)? Como você evita esses problemas?