Faltando qualifier 'virtual' em declarações de função
-
19-08-2019 - |
Pergunta
Apesar de arrasto através de algum código antigo me deparei com algo semelhante ao seguinte:
class Base
{
public:
virtual int Func();
...
};
class Derived : public Base
{
public:
int Func(); // Missing 'virtual' qualifier
...
};
A multa compila o código (MS VS2008) com nenhum aviso (nível 4) e funciona como esperado - Func
é virtual, embora o qualificador virtual está faltando na classe derivada. Agora, outra de causar alguma confusão, existem perigos com este código ou devo mudar tudo, adicionando o qualificador virtual
?
Solução
O virtual
será realizada até todas as funções primordiais em classes derivadas. O único benefício real para adicionar a palavra-chave é para significar sua intenção um observador casual da definição de classe derivada vai saber imediatamente que Func
é virtual.
aulas Mesmo que se estendem Derivados terá métodos Func virtuais.
Referência: funções virtuais no MSDN. Role a página para ver
O virtual palavra-chave pode ser usado quando declarando funções primordiais em um derivada classe, mas é desnecessário; sobreposições de funções virtuais são sempre virtual.
Outras dicas
Aqui está um interessante consequência de não precisar declarar funções primordiais virtual:
template <typename Base>
struct Derived : Base
{
void f();
};
f é se Derivado será virtual depende se Derivado é instanciado com uma base com uma função f virtual da assinatura direita.
Alguém me disse uma vez que compiladores muito velho C ++, não conforme com a especificação, exigem virtual a ser definida para todas as subclasses. Isso não é um problema anymore.
Um dos perigos de seguir esta prática é que as pessoas podem não perceber que eles precisam a palavra-chave virtual em funções que se destinam a ser virtual. Isso é mais provável a ser pessoas provenientes de línguas onde não existe o conceito de funções não-virtual (por exemplo: Java, REALbasic). Como corolário, você não pode dizer quando virtual foi deliberadamente omitido porque uma função é suposto ser não-virtual.
Eu suspeito que algumas ferramentas de análise de código também não pode ser inteligente o suficiente para pegar a virtualidade herdada.