Clases y c ++ abstractos

Video: Curso de C++: Clases Abstractas en C++

C ++ soportes el enlace en tiempo, que es cuando se resuelve una llamada de método basado en el tipo de tiempo de ejecución (o tipo dinámico) del objeto de destino en lugar de su tipo declarado (o tipo estático). Esto se demuestra en el siguiente fragmento de código C ++:

#incluir el uso de espacio de nombres de clase std Horno {public: virtual de cocinero void () {cout lt; lt; "Cocinar con un horno" lt; lt; endl -}} - horno de microondas clase: public Horno {public: virtual de cocinero void () {cout lt; lt; "Cocinar con un horno de microondas" lt; lt; endl -}} - prepareMeal vacío (Horno& horno) {oven.cook () -}

En la función prepareMeal (), la llamada a oven.cook () puede pasar a Horno :: cocinar () o Horno de microondas :: cocinar () dependiendo del tiempo de ejecución (la “real”) Tipo de la horno objeto pasado.

Video: 033.- Curso de C++. Uso de Casting y Clases Abstractas en C++

los virtual la palabra clave aquí es crítica. Sin él, el cocinar() Método estaría obligado temprano, basándose en el tipo en tiempo de compilación, e invocar Horno :: cocinar () cada vez. Una vez declarada virtual en el Horno clase, se asume que el método es virtual en cada subclase pero no está de más repetir la declaración para que los lectores entiendan.

El siguiente programa sencillo demuestra este principio en la práctica:

int main () {Horno Horno-prepareMeal (horno) -MicrowaveOven mo-prepareMeal (MO) -Retorno 0-}

En este programa, la llamada a cocinar() genera dos salidas diferentes dependiendo del tipo de horno:

Cocinar con un ovenCooking con un horno de microondas

No siempre es el caso, que un método en la clase base puede ser definido. Considera el Horno mayúsculas y con más cuidado. Hay un número de diferentes tipos de hornos - hornos convencionales, hornos de convección y hornos de microondas - pero se podría argumentar que no hay horno real que no pertenezca a una de estas subclases. Es posible que pueda decir cómo los distintos tipos de hornos realizan la cocinar la operación - que es, lo que es una ConventionalOven :: cocinar () y una Horno de microondas :: cocinar () debe hacer puede ser definido. Probablemente no sea posible definir qué acciones Horno :: cocinar () debe llevar a cabo.

No se puede simplemente dejar Horno :: cocinar () no declarado en un lenguaje fuertemente tipado como C ++. Sin embargo, puede declarar un método pero se deja sin aplicarse si no existe una aplicación. Uno de ellos utiliza la siguiente sintaxis curiosidad de hacerlo:

Horno de clase {public: virtual de cocinero vacío () = 0 -} -

Este código declara un método Horno::cocinar() que está obligado tarde, pero no implementa el método. De hecho, va más allá al decir que no se llevará a cabo el método. En C ++, se dice que un método tal que sea virtual pura. los programadores de C ++ también utilizan el término preferido en muchos otros lenguajes de programación inflexible: abstracto. los Horno clase se dice que es abstracto.

Video: Sustantivos concretos y abstractos - Lengua - Educatina

Un resumen representa una propiedad que ya sabe la clase posee, pero no saben cómo poner en práctica de forma inequívoca en la clase actual.

Una clase es abstracta si contiene uno o más puros métodos virtuales. La importancia de esto es que no se puede crear una instancia de una clase abstracta. Por lo tanto ya no se permite que el siguiente:

int main () {Horno Horno-prepareMeal (horno) -Retorno 0-}

La razón de esto es bastante simple: si ha creado un objeto de clase Horno y luego trató de invocar oven.cook (), ¿qué debería hacer el compilador?

Video: 08 POO - Polimorfismo, Clases y Métodos Abstractos

A un nivel más filosófico, está bien decir que hay algún término común que se llama Horno que describe los hornos convencionales y hornos de microondas y hornos de convección. Este término Horno es un concepto habitual ya que se une a las similitudes en todas estas subclases. Pero no hay una instancia de un horno que no es una de las subclases de Horno.

Una subclase de una clase abstracta es en sí misma abstracta hasta que todos los métodos virtuales puros han sido anulados por no abstracta (es decir, hormigón) versiones. Así, la clase Horno microondas en el fragmento de código anterior no es abstracto - incluso si Horno fueron abstracto - ya que anula cocinar() con su propia versión de hormigón.

Observe que no hay nada malo con la función prepareMeal () se define como sigue:

prepareMeal anular (Horno& horno) {oven.cook () -}

A pesar de que el argumento se declara a ser una Horno, sólo puede ser invocado con cierta subclase de Horno, como Horno microondas o Horno convencional, para cual cocinar() se define.

Artículos Relacionados