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?

Foi útil?

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.

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