Uma virtual
função pura deve ser implementada em um tipo derivado que será instanciado diretamente, no entanto, o tipo base ainda pode definir uma implementação. Uma classe derivada pode chamar explicitamente a implementação da classe base (se as permissões de acesso permitirem) usando um nome com escopo completo (chamando A::f()
no seu exemplo - se A::f()
fosse public
ou protected
). Algo como:
class B : public A {
virtual void f() {
// class B doesn't have anything special to do for f()
// so we'll call A's
// note that A's declaration of f() would have to be public
// or protected to avoid a compile time problem
A::f();
}
};
O caso de uso em que consigo pensar é quando há um comportamento padrão mais ou menos razoável, mas o designer de classe deseja que esse tipo de comportamento seja invocado apenas explicitamente. Também pode ser o caso em que você deseja que as classes derivadas sempre executem seu próprio trabalho, mas também possam chamar um conjunto comum de funcionalidades.
Observe que, embora seja permitido pela linguagem, não é algo que eu vejo comumente usado (e o fato de que isso pode ser feito parece surpreender a maioria dos programadores de C ++, mesmo os mais experientes).
deported
. (em .inl ou .cpp para se referir a práticas comuns de nomeação de arquivos).