idioma da interface nonvirtual por mais de dois níveis de herança?
-
02-07-2019 - |
Pergunta
O idioma da interface nonvirtual descreve como os métodos virtuais são pontos de personalização não públicas, e métodos públicos são nonvirtual para permitir que a classe base para controlar em todos os momentos como os pontos de personalização são chamados.
Esta é uma expressão elegante e eu gosto de usá-lo, mas como ele funciona se a classe derivada é uma classe base em si
Solução
Ele funciona, porque a classe derivada pode substituir uma função virtual privado de uma classe base, mesmo que a função de classe base sobrepõe a sua função de classe base.
Isto é perfeitamente legal:
class Parent
{
public:
int foo() {return bar();} // the non-virtual public interface
private
virtual int bar();
};
class Child : public Parent
{
private:
virtual int bar(); // overrides Parent::bar()
};
class Grandchild : public Child
{
private:
virtual int bar(); // overrides Child::bar();
};
Outras dicas
A classe derivada pode decidir por si mesmo:
Você pode simplesmente substituir o método completamente por implementar a função virtual. Você pode aumentar o método chamando as classes 'meio' funcionar em algum momento de seu método de classe derivada.
Se isso não é o que você quer, você precisa configurá-lo explicitamente na classe 'média'. Não que faria. Se você está desejando isso, isso provavelmente significa que você não deu a classe base pontos de personalização suficientes.