Pregunta

lo que significa exactamente de technical point of view, entendí que significa que mi derived class siempre se puede convertir en base class, eso es todo? He leído algunos materiales sin ninguna referencia a los aspectos técnicos, única filosofía! gracias de antemano

¿Fue útil?

Solución

significa que mi clase derivada siempre se puede convertir en la clase base

En realidad esto significa más que eso. int siempre se puede convertir en float, pero eso no significa un int "es un" flotador. Sólo significa un flotador puede ser construido a partir de un int. Del mismo modo se puede tener clases definidas por el usuario que se convierten, pero no tienen otra relación.

Con la herencia, un puntero o referencia a la clase derivada puede siempre ser convertido a un puntero o referencia a la clase base [*]. Es decir, un objeto de la clase derivada puede estar en el lugar de un objeto de la clase base. En realidad, es una de esas cosas. Si una persona puede sustituir a un cirujano del cerebro, entonces son un neurocirujano.

Una definición formal si "es un" es de Bárbara Liskov sustitución principio . Que la verdad sigue siendo la filosofía, pero es filosofía muy sólida y se relaciona directamente con la forma de escribir programas.

La otra cosa que hay que seguir recto cuando se utiliza la herencia en C ++ es la diferencia entre el polimorfismo en tiempo de ejecución (que se logra usando funciones virtual) y el polimorfismo estático (que en realidad no requieren la herencia en absoluto). Con llamadas a funciones no virtuales, la versión de la función llamada es siempre la versión definida en la clase que el compilador se le dice que el objeto tiene (el tipo estático). En realidad, esto no podría funcionar correctamente, si está sobrecargado en la clase derivada. Con las llamadas virtuales, la versión es la versión llamada definido en la clase del objeto es en realidad (el tipo dinámico). Es esencial para decidir cuál de los dos tipos de "es un" usted está apuntando.

[*] y el objeto sea válidamente accesible a través del puntero, que es. Siempre se puede coaccionar con tipos de puntero reinterpret_cast, pero eso no es lo que quiero decir aquí. Y hay algunos detalles complicados - si la clase base es ambiguo, entonces no puede convertir el puntero de una sola vez, pero se puede hacer de forma explícita el uso de varios moldes sin ambigüedades. Si la clase base no es accesible, entonces puede convertirlo, pero sólo con una conversión de estilo C, no implícita. La conversión de estilo C actúa como un static_cast que ignora la accesibilidad, no como un reinterpret_class. Así se obtiene un puntero de trabajo, pero es de esperar también una fuerte sensación de que estás haciendo algo muy mal; -)

Otros consejos

A derivado de clase se puede convertir en solamente una clase base accesible y sin ambigüedades en un punto R. dado No hay escasez de referencias y qué otro lugar que el C ++ estándar sí mismo.

  

$ 10.2 es una referencia buena: Una deriva   clase puede servir por sí misma como una clase base   sujeto a control de acceso; ver 11.2. UN   puntero a una clase derivada puede ser   implícitamente convertido a un puntero a   una clase base no ambigua accesible   (4,10). Un lvalue de una clase derivada   tipo puede estar unido a una referencia a una   accesibles clase base no ambigua   (8.5.3). -fin nota]

Y de nuevo

  

$ 10.3 - "El especificador-base de la lista   especifica el tipo de la clase base   subobjetos contenida en un objeto de   el tipo de clase derivada. [..] Aquí, una   objeto de la clase tendrá un Derived2   subobjeto de clase derivada que en   a su vez tendrá un subobjeto de la clase   Base. [...]

En cuanto a los principios de OOAD:

Yo personalmente recomiendo artículos de Robert Martin para conseguir un buen control sobre esto, especialmente el principio de OCP . No es posible para mí para vencer a la claridad y la autoridad con la que el autor explica estas pautas OOAD legendarios

También se fijan en LSP como se explica en el post @Steves'

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top