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 é?

Foi útil?

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 ++.

Ver: http://en.wikipedia.org/wiki/diamond_problem

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top