Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Método Virtual Puro | Visión General del Polimorfismo
POO en C++
course content

Contenido del Curso

POO en C++

POO en C++

1. Fundamentos de la POO en C++
2. Constructores y Destructores
3. Visión General de la Encapsulación
4. Visión General de la Herencia
5. Visión General del Polimorfismo

book
Método Virtual Puro

El concepto de métodos virtuales es fundamental para lograr el polimorfismo, permitiendo un diseño de software flexible y extensible. Los métodos virtuales puros amplían esto al definir interfaces y admitir la vinculación dinámica.

Sintaxis de método virtual puro

Un método virtual puro se declara con la palabra clave virtual y se inicializa a cero. Esto indica que la función no tiene definición dentro de la class y debe ser sobrescrita por cualquier subclase antes de que se puedan instanciar objetos de esa class.

virtual.h

virtual.h

copy
1
virtual void example() = 0;

Este método funciona de manera similar a uno estándar, excepto que carece de un cuerpo encerrado en { } y, en su lugar, termina con = 0;, lo que indica que no tiene implementación. Sin embargo, las demás reglas para este método son las mismas que para los métodos regulares.

Declarar un método virtual puro convierte la class donde se declara en abstracta, lo que significa que se vuelve imposible instanciar objetos de esa clase. Esta restricción existe porque cada método dentro de la class debe ser implementado antes de crear y utilizar una instancia, con el fin de prevenir errores y comportamientos impredecibles. Observe el siguiente código:

Animal.h

Animal.h

copy
1234
class Animal { public: virtual void speak() = 0; };

La Animal class presenta un método virtual puro llamado speak(), lo que impide la instanciación de objetos de esta clase. Este diseño es lógico, ya que el propósito del método virtual es representar los sonidos distintivos que emite cada animal.

Al declarar el método como virtual, se permite que cada subclase implemente su propia versión, capturando la individualidad del sonido de cada animal. Declararlo como virtual puro indica que no existe una implementación por defecto, enfatizando la necesidad de implementaciones concretas en las clases derivadas.

main.cpp

main.cpp

copy
1234567
#include "Animal.h" int main() { // cannot declare variable 'animal' to be of abstract type Animal animal; }

Esto también es lógico. Crear instancias de la Animal class sería impráctico y poco intuitivo, ya que representa un concepto abstracto que sirve como categoría para varios animales. No existe un comportamiento específico asociado a un animal genérico, lo que refuerza la naturaleza abstracta de la class y resalta la importancia de crear subclases especializadas para capturar los sonidos únicos de cada animal específico.

main.cpp

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#include <iostream> class Animal { public: // Pure virtual function to enforce implementation in derived classes virtual void speak() = 0; }; class Cat : public Animal { public: void speak() override { std::cout << "Meow!" << std::endl; } }; class Dog : public Animal { public: void speak() override { std::cout << "Bark!" << std::endl; } }; class Cow : public Animal { public: void speak() override { std::cout << "Moo!" << std::endl; } }; void pet(Animal& animal) { animal.speak(); } int main() { // Replace `Cat` with `Dog` or `Cow` to see their specific behavior Cat cat; pet(cat); }

Aunque no es posible crear un objeto del tipo Animal directamente, aún podemos utilizarlo como parámetro en una función. De manera similar al ejemplo anterior del botón, este enfoque aprovecha el polimorfismo para crear un programa versátil que puede modificar su comportamiento dinámicamente en tiempo de ejecución.

Note
Nota

Intente pasar un objeto de una class diferente a la función y observe la salida. Además, intente crear un objeto de la class abstracta para ver cómo el compilador impide la instanciación debido a métodos virtuales puros no implementados.

question mark

¿Qué sucede cuando una clase contiene un método virtual puro?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 5. Capítulo 3

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

course content

Contenido del Curso

POO en C++

POO en C++

1. Fundamentos de la POO en C++
2. Constructores y Destructores
3. Visión General de la Encapsulación
4. Visión General de la Herencia
5. Visión General del Polimorfismo

book
Método Virtual Puro

El concepto de métodos virtuales es fundamental para lograr el polimorfismo, permitiendo un diseño de software flexible y extensible. Los métodos virtuales puros amplían esto al definir interfaces y admitir la vinculación dinámica.

Sintaxis de método virtual puro

Un método virtual puro se declara con la palabra clave virtual y se inicializa a cero. Esto indica que la función no tiene definición dentro de la class y debe ser sobrescrita por cualquier subclase antes de que se puedan instanciar objetos de esa class.

virtual.h

virtual.h

copy
1
virtual void example() = 0;

Este método funciona de manera similar a uno estándar, excepto que carece de un cuerpo encerrado en { } y, en su lugar, termina con = 0;, lo que indica que no tiene implementación. Sin embargo, las demás reglas para este método son las mismas que para los métodos regulares.

Declarar un método virtual puro convierte la class donde se declara en abstracta, lo que significa que se vuelve imposible instanciar objetos de esa clase. Esta restricción existe porque cada método dentro de la class debe ser implementado antes de crear y utilizar una instancia, con el fin de prevenir errores y comportamientos impredecibles. Observe el siguiente código:

Animal.h

Animal.h

copy
1234
class Animal { public: virtual void speak() = 0; };

La Animal class presenta un método virtual puro llamado speak(), lo que impide la instanciación de objetos de esta clase. Este diseño es lógico, ya que el propósito del método virtual es representar los sonidos distintivos que emite cada animal.

Al declarar el método como virtual, se permite que cada subclase implemente su propia versión, capturando la individualidad del sonido de cada animal. Declararlo como virtual puro indica que no existe una implementación por defecto, enfatizando la necesidad de implementaciones concretas en las clases derivadas.

main.cpp

main.cpp

copy
1234567
#include "Animal.h" int main() { // cannot declare variable 'animal' to be of abstract type Animal animal; }

Esto también es lógico. Crear instancias de la Animal class sería impráctico y poco intuitivo, ya que representa un concepto abstracto que sirve como categoría para varios animales. No existe un comportamiento específico asociado a un animal genérico, lo que refuerza la naturaleza abstracta de la class y resalta la importancia de crear subclases especializadas para capturar los sonidos únicos de cada animal específico.

main.cpp

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#include <iostream> class Animal { public: // Pure virtual function to enforce implementation in derived classes virtual void speak() = 0; }; class Cat : public Animal { public: void speak() override { std::cout << "Meow!" << std::endl; } }; class Dog : public Animal { public: void speak() override { std::cout << "Bark!" << std::endl; } }; class Cow : public Animal { public: void speak() override { std::cout << "Moo!" << std::endl; } }; void pet(Animal& animal) { animal.speak(); } int main() { // Replace `Cat` with `Dog` or `Cow` to see their specific behavior Cat cat; pet(cat); }

Aunque no es posible crear un objeto del tipo Animal directamente, aún podemos utilizarlo como parámetro en una función. De manera similar al ejemplo anterior del botón, este enfoque aprovecha el polimorfismo para crear un programa versátil que puede modificar su comportamiento dinámicamente en tiempo de ejecución.

Note
Nota

Intente pasar un objeto de una class diferente a la función y observe la salida. Además, intente crear un objeto de la class abstracta para ver cómo el compilador impide la instanciación debido a métodos virtuales puros no implementados.

question mark

¿Qué sucede cuando una clase contiene un método virtual puro?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 5. Capítulo 3
some-alt