Pode parecer uma pergunta simples, mas não consigo encontrar a resposta em nenhum outro lugar.
Suponha que eu tenha o seguinte:
class Abstract {
public:
virtual void foo() = 0;
virtual void bar();
}
class Derived : Abstract {
public:
virtual void foo();
}
Está tudo bem que a classe Derived não implementa a função bar ()? E se não TODAS as minhas classes derivadas precisarem da função bar (), mas algumas sim. Todas as funções virtuais de uma classe base abstrata precisam ser implementadas nas classes derivadas ou apenas aquelas que são puramente virtuais? obrigado
fonte
Derived::bar
tem um corpo de função, o deAbstract::bar
. Portanto, parece que a unidade de tradução onde isso é definido (será que está definida em algum lugar?) Não está vinculada à unidade de tradução onde é chamada.They only need to implement the pure ones.
É enganoso. As classes derivadas também não precisam necessariamente implementar funções virtuais puras .Apenas os métodos virtuais puros devem ser implementados em classes derivadas, mas você ainda precisa de uma definição (e não apenas uma declaração) dos outros métodos virtuais. Se você não fornecer um, o vinculador pode muito bem reclamar.
Portanto, apenas colocar
{}
depois de seu método virtual opcional fornece uma implementação padrão vazia:class Abstract { public: virtual void foo() = 0; // pure virtual must be overridden virtual void bar() {} // virtual with empty default implementation }; class Derived : Abstract { public: virtual void foo(); };
Porém, uma implementação padrão mais envolvida entraria em um arquivo de origem separado.
fonte
O padrão ISO C ++ especifica que todos os métodos virtuais de uma classe que não sejam virtuais puros devem ser definidos.
A regra é simplesmente:
se sua classe derivada substituir o método virtual da classe Base, ela também deverá fornecer uma definição. Caso contrário, a classe Base deverá fornecer a definição desse método.
Conforme a regra acima em seu exemplo de código,
virtual void bar();
precisa de uma definição na classe Base.Referência:
Padrão C ++ 03: 10.3 Funções virtuais [class.virtual]
Portanto, você deve tornar a função puramente virtual ou fornecer uma definição para ela.
O gcc faq também documenta:
fonte
Sim, tudo bem ... você só precisa implementar quaisquer funções virtuais puras para instanciar uma classe derivada de uma classe base abstrata.
fonte
Sim, é correto que uma classe derivada tem que ignorar a função que é virtual pura na classe pai. A classe pai com uma função virtual pura é chamada de classe abstrata apenas porque sua classe filho deve fornecer seu próprio corpo da função virtual pura.
Para as funções virtuais normais: - Não é necessário sobrescrevê-las mais, como algumas classes filho podem ter essa função, outras podem não ter.
O objetivo principal do mecanismo de Função Virtual é o Polimorfismo do Tempo de Execução, sendo que o objetivo principal da Função Virtual Pura (Classe Abstrata) é tornar obrigatório ter o mesmo nome Função com o corpo próprio.
fonte