Menu
Coddy logo textTech

Herencia básica

Parte de la sección Programación Orientada a Objetos del Journey de C++ de Coddy — lección 48 de 104.

La herencia permite que una clase adquiera las propiedades y comportamientos de otra clase. La clase de la que se hereda se llama clase base (o padre), y la clase que hereda se llama clase derivada (o hija).

Para crear una clase derivada, utilice dos puntos seguidos por el especificador de acceso y el nombre de la clase base:

class Animal {
public:
    std::string name;
    
    void eat() {
        std::cout << name << " is eating" << std::endl;
    }
};

class Dog : public Animal {
public:
    void bark() {
        std::cout << name << " says woof!" << std::endl;
    }
};

La clase Dog ahora tiene acceso tanto a name como a eat() de Animal, además de su propio método bark(). Esta es la esencia de la herencia: reutilizar código existente mientras se añade nueva funcionalidad.

Dog myDog;
myDog.name = "Buddy";
myDog.eat();    // Heredado de Animal
myDog.bark();   // Definido en Dog

La palabra clave public antes de Animal especifica el tipo de herencia. La herencia pública significa que los miembros públicos de la clase base permanecen públicos en la clase derivada. Esta es la forma más común y modela una relación "es-un": un Dog es un Animal.

challenge icon

Desafío

Fácil

Vamos a construir una jerarquía de vehículos simple que demuestre la herencia en acción. Crearás una clase base Vehicle y una clase derivada Motorcycle que la extiende con un comportamiento especializado.

Organizarás tu código en tres archivos:

  • Vehicle.h: Define una clase base Vehicle con:
    • Un miembro público std::string brand
    • Un miembro público int year
    • Un método público displayInfo() que imprime la marca y el año del vehículo en el formato: Brand: <brand>, Year: <year>
  • Motorcycle.h: Define una clase Motorcycle que hereda públicamente de Vehicle. Esta clase derivada debe añadir:
    • Un miembro público int engineCC para la cilindrada del motor
    • Un método público revEngine() que imprime: <brand> goes vroom vroom!

    La clase Motorcycle heredará automáticamente brand, year y displayInfo() de Vehicle.

  • main.cpp: Lee tres entradas (cada una en una línea separada):
    1. Nombre de la marca (string)
    2. Año (integer)
    3. CC del motor (integer)

    Crea un objeto Motorcycle, establece sus miembros heredados (brand y year) así como su propio miembro engineCC. Luego, demuestra la herencia llamando tanto al método heredado como al método específico de la motocicleta.

    Formato de salida:

    Brand: <brand>, Year: <year>
    Engine: <engineCC>cc
    <brand> goes vroom vroom!

Por ejemplo, con las entradas Harley, 2022 y 1200:

Brand: Harley, Year: 2022
Engine: 1200cc
Harley goes vroom vroom!

No olvides incluir protectores de encabezado (header guards) en tus archivos de cabecera y usar #include "Vehicle.h" en tu encabezado de Motorcycle para acceder a la clase base.

Hoja de referencia

La herencia permite que una clase adquiera propiedades y comportamientos de otra clase. La clase de la que se hereda es la clase base (padre), y la clase que hereda es la clase derivada (hijo).

Para crear una clase derivada, use dos puntos seguidos del especificador de acceso y el nombre de la clase base:

class Animal {
public:
    std::string name;
    
    void eat() {
        std::cout << name << " is eating" << std::endl;
    }
};

class Dog : public Animal {
public:
    void bark() {
        std::cout << name << " says woof!" << std::endl;
    }
};

La clase derivada tiene acceso a los miembros públicos de la clase base además de sus propios miembros:

Dog myDog;
myDog.name = "Buddy";
myDog.eat();    // Inherited from Animal
myDog.bark();   // Defined in Dog

La palabra clave public especifica la herencia pública, lo que significa que los miembros públicos de la clase base siguen siendo públicos en la clase derivada. Esto modela una relación "es-un".

Pruébalo tú mismo

#include <iostream>
#include <string>
#include "Motorcycle.h"

using namespace std;

int main() {
    string brand;
    int year;
    int engineCC;

    cin >> brand;
    cin >> year;
    cin >> engineCC;

    // TODO: Crear un objeto Motorcycle
    // TODO: Establecer sus miembros brand, year y engineCC
    // TODO: Llamar a displayInfo() para mostrar la información heredada
    // TODO: Imprimir la información del motor en el formato: Engine: <engineCC>cc
    // TODO: Llamar a revEngine() para demostrar el comportamiento específico de la motocicleta

    return 0;
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos