Subclasse C ++ que deriva de classes que derivam da mesma classe
-
25-09-2019 - |
Pergunta
Por que a seguinte estrutura de herança não é legítima no C ++?
- Filho1 deriva do pai1
- Filho2 deriva do pai1
- Netoson1 deriva de Son1 e Son2
Se poderia haver um caso em que isso seja legítimo (talvez se todas as classes sejam puras-virtuais, exceto netons1), o que são e como é que é?
Solução
Você está errado, isso é perfeitamente legal no C ++. Você pode olhar para herança virtual no entanto.
Outras dicas
Esta hierarquia de herança é chamada de diamante da morte E é legal no C ++ se você usar a herança virtual, embora geralmente ainda seja problemática.
Este é o problema do diamante C ++.
Este é o diamante típico de herança. Ocorre mesmo na biblioteca padrão, onde o iostream deriva de ISTream e Ostream e ambos derivam do iOS_Base.
Existem vários problemas:
Se o pai tem um método virtual e o SON1 e o SON2 o implementam, a menos que o neto também o implemente, ele deve declarar qual dos métodos SON1 e SON2 ele implementa.
Se o pai tiver algum membro de dados, o neto os receberá duas vezes.
De qualquer forma, o pai tem uma tabela em V, então você parece obter 2 cópias disso.
As classes médias, portanto, geralmente usam a herança virtual, o que é complicado, mas efetivamente significa que apenas a classe final recebe a classe base. Portanto, neste caso, o próprio neto é responsável por construir o pai e supõe -se que "tivesse" isso.
Há mais problemas para tomar cuidado se você for lançar algum ponteiro. Particularmente tenha cuidado com o elenco de e para um vazio*.
Eu acho que você está confundindo hierarquia de classe e instância de classe.
Uma classe "neto" pode derivar de uma aula de "filho", mas uma instância de um "neto" não pode ser de 2 instâncias da classe "filho"
Em qualquer caso, acho que você não deve fazer assim, porque em algum momento você terá uma classe "neta-neta" e uma classe "neta-neta".
Faça a relação entre os pais e os irmãos de outra maneira.