Pergunta

Eu estava lendo a palavra-chave selado em C #. Eu não posso me lembrar da última vez que eu herdar de uma biblioteca padrão. Em c ++ Lembro-me de herdar uma interface std que typedef alguns tipos e usou alguns dos meus parâmetros. Mas isso é 1) Trivial 2) Uma interface

A partir do topo da minha cabeça, eu não me lembro de nenhuma classe que eu herdei que não tinha uma função virtual com a expectativa de ser herdada. Alguém pode me dizer de uma situação em que você precisava para herdar uma classe não trivial que não era uma interface?

Eu poderia até dizer que é uma boa regra de ouro não para herdar uma classe a menos que tenha funções virtuais. Esta é uma boa regra de ouro?

NOTA: Eu uso um operador SomeClass & SomeClass () {return m_someClass; } No caso eu preciso passar meu objeto de outra classe. Ele funciona bem.

Foi útil?

Solução

Na verdade, é usado em C ++, para todos estes não-é-um tipo de herança (ex. Herdando uma implementação, mixins, boost :: noncopyable, onde você herdar-lo e fazer sua classe noncopyable, boost :: operadores onde você herdar de alguma classe e ele irá adicionar alguns operadores a sua classe). Além disso, ao fazer com metaprogramação tipos C ++, herdar a partir de outro tipo (s) é um dos métodos mais simples de compor tipos.

Outro caso onde você herdar de uma classe que não tem funções virtuais, mas serve como "espécie de" uma interface, é polimorfismo estático (técnicas como CRTP, onde a classe ConcreteA: baseA). Eles não precisam as funções virtuais, porque tudo é resolvido em tempo de compilação.

No entanto, se você quiser tratar sua classe runtime-polimorficamente, você realmente deve fazer pelo menos um método de virtual, e que seria o destruidor. Há exceções, mas raro.

Mesmo quando você tem uma hierarquia polimórfica, às vezes você derivar de classes concretas. Um exemplo seria um SingleLineEdit decorrente TextEdit. No entanto, este é um pouco perigoso, porque quebra o encapsulamento da classe pai (por exemplo, seus métodos podem esperar alguns detalhes de implementação, e você deve respeitar e preservá-los na subclasse -. O que pode ser complicado, uma vez que são detalhes de implementação que podem alteração sem aviso prévio na próxima versão etc.)

Outras dicas

Eu diria que o conceito-chave da programação orientada a objeto é polimorfismo. Se herdando de uma classe particular não permite-lhe tirar partido do polimorfismo, então qual é o ponto de herdar? Então, se não existem métodos para substituir, em seguida, fazer não subclasse. Você só estaria aumentando a complexidade de seu código. Se você quer um monte da mesma funcionalidade, só embrulhar a classe existente em seu próprio país.

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