Skip to main content

O que é herança virtual?

Herança virtual é um tipo de herança em que a implementação de uma superclasse é incompleta e é necessária uma subclasse para a definição completa de um objeto. Esse tipo de herança pode ser usado em conjunto com a herança única e múltipla, mas é mais comumente usado na herança múltipla. Qualquer classe que herda de uma classe base virtual torna-se uma subclasse direta dessa classe base. Uma classe base virtual pode contar com uma subclasse para implementar todos os seus métodos, mas isso não é um requisito.

C ++ é a linguagem de computador mais comumente usada para usar herança virtual. Para declarar herança virtual em C ++, a palavra-chave "virtual" é usada. A superclasse e a subclasse devem declarar métodos virtuais com a palavra-chave "virtual". Isso informa ao compilador C ++ que a superclasse está incompleta e deve obter informações da subclasse para concluí-la. O uso da subclasse para concluir a superclasse não significa que as subclasses se sobrescrevam se tiverem a mesma classe base e, em vez disso, o compilador C ++ se encarrega de determinar quais partes vão para cada objeto.

Como uma classe base virtual é necessária para herança virtual, funções globais em C ++ não podem ser declaradas virtuais. Esse tipo de herança só pode ser usado ao seguir os princípios de programação orientada a objetos (OOP). A razão para isso é que as funções globais não estão associadas a uma classe específica e, portanto, geralmente são independentes por si próprias. Sem uma superclasse e subclasse, a herança não pode acontecer, portanto, funções globais e herança virtual são mutuamente exclusivas. As funções globais podem, em teoria, ser usadas dentro de funções virtuais, mas o inverso nem sempre pode funcionar.

A herança virtual é usada para resolver muitos problemas de programação, e um dos mais úteis é a resolução de ambiguidade. Na herança múltipla, pode-se ter uma classe base A que possui duas subclasses, B e C e, em seguida, uma classe D que herda das classes B e C. Esse padrão é geralmente chamado de "diamante da morte" porque, se as classes A, B e C têm implementações do mesmo método, não é possível para a classe D determinar qual implementação deve ser usada. A herança virtual resolve esse problema porque a implementação de cada classe permanece distinta e, portanto, inequívoca. Essa distinção é tratada por objetos internos especializados chamados tabelas virtuais (vtables) que controlam cada tipo de objeto, mas essas tabelas não precisam ser explicitamente manipuladas por um programador, pois são incorporadas à linguagem.