Pergunta

O que exatamente isso significa de technical point of view, Eu entendi que significa que meu derived class sempre pode ser convertido para base class, é isso? Eu li alguns materiais sem qualquer referência a aspectos técnicos, apenas filosofia! desde já, obrigado

Foi útil?

Solução

Isso significa que minha classe derivada sempre pode ser convertida para a classe base

Na verdade, significa melhor do que isso. int sempre pode ser convertido para float, mas isso não significa que um int "é um" flutuador. Significa apenas que um flutuador pode ser construído a partir de um int. Da mesma forma, você pode ter classes definidas pelo usuário que se convertem, mas não têm outro relacionamento.

Com a herança, um ponteiro ou referência à classe derivada sempre pode ser convertida em um ponteiro ou referência à classe base [*]. Ou seja, um objeto da classe derivada pode estar no lugar de um objeto da classe base. Na verdade, é uma dessas coisas. Se uma pessoa pode se destacar em um cirurgião cerebral, ela é um cirurgião cerebral.

Uma definição formal se "for a" é Barbara Liskov's Princípio de substituição. O que ainda é filosofia, mas é uma filosofia muito sólida e se relaciona diretamente com a forma como você escreve programas.

A outra coisa que você deve manter reta ao usar a herança no C ++ é a diferença entre o polimorfismo de tempo de execução (alcançado usando virtual funções) e polimorfismo estático (que na verdade não requer herança). Com chamadas de função não virtual, a versão da função chamada é sempre a versão definida na classe que o compilador é informado de que o objeto tem (o tipo estático). Isso pode não funcionar corretamente, se estiver sobrecarregado na classe derivada. Com chamadas virtuais, a versão chamada é a versão definida na classe que o objeto realmente é (o tipo dinâmico). É essencial decidir qual dos dois tipos de "é um" que você está buscando.

*] E o objeto será validamente acessível através do ponteiro, ou seja. Você sempre pode coagir os tipos de ponteiro com reinterpret_cast, mas não é isso que quero dizer aqui. E existem alguns detalhes complicados - se a classe base for ambígua, você não poderá converter o ponteiro de uma só vez, mas você pode fazê -lo explicitamente usando vários elencos inequívocos. Se a classe base não estiver acessível, então você posso converte-o, mas apenas com um elenco de estilo C, não implicitamente. O elenco do estilo C age como um static_cast o que ignora a acessibilidade, não como um reinterpret_class. Então você obtém um ponteiro de trabalho, mas espero também uma forte sensação de que você está fazendo algo muito errado ;-)

Outras dicas

Uma classe derivada pode ser convertida apenas para uma classe base acessível e inequívoca em um determinado ponto R. Não há escassez de referências e que outro lugar além do próprio padrão C ++.

US $ 10.2 é uma boa referência: uma classe derivada pode servir como uma classe base sujeita ao controle de acesso; Veja 11.2. Um ponteiro para uma classe derivado pode ser implicitamente convertido em um ponteiro para uma classe base inequívoca acessível (4.10). Um LValue de um tipo de classe derivado pode estar vinculado a uma referência a uma classe base inequívoca acessível (8.5.3). - nota de end

E de novo

$ 10.3-"A lista de especificadores de base especifica o tipo de subobjetos da classe base contido em um objeto do tipo de classe derivado. [..] Aqui, um objeto de classe derivado2 terá um subobjeto de classe derivado que por sua vez terá um subobjeto da base de classe. [...

Em termos de princípios de OOAD:

Eu recomendo pessoalmente Artigos de Robert Martin por conseguir um bom controle sobre isso, especialmente o princípio do OCP. Não é possível vencer a clareza e a autoridade com a qual o autor explica essas lendárias diretrizes

Veja também o LSP, conforme explicado na postagem @Steves '

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