← SEARCHABLE ARCHIVE
C / C++ · 2026-06-12

C++ de los fundamentos al dominio — Lección 8

Herencia y polimorfismo, vida útil del objeto y RAII.

INTERACTIVE READING MODE →

Los artículos escritos en este blog fueron creados con el objetivo de enseñar. Además, la información del artículo puede ser incorrecta, así que tenga cuidado.

Tanto el guerrero como el arquero son personajes, pero sus métodos de ataque son diferentes. Los datos comunes se pueden colocar en la clase principal y se pueden implementar diferentes operaciones en la clase secundaria.

Herencia y polimorfismo

class Character
{
public:
    Character(const std::string& name)
        : name(name)
    {
    }

    virtual ~Character() = default;
    virtual int Attack() const = 0;

    const std::string& GetName() const
    {
        return name;
    }

private:
    std::string name;
};

class Warrior : public Character
{
public:
    Warrior(const std::string& name)
        : Character(name)
    {
    }

    int Attack() const override
    {
        return 20;
    }
};

class Archer : public Character
{
public:
    Archer(const std::string& name)
        : Character(name)
    {
    }

    int Attack() const override
    {
        return 15;
    }
};

Attack() = 0Una clase con funciones virtuales puras sin implementación se convierte en una clase abstracta. El personaje en sí no se puede crear y las clases secundarias se ven obligadas a implementar Attack.

overrideSi agrega , el compilador detecta un error cuando la firma es diferente de la firma de la función principal. Esto puede evitar errores que den como resultado que una nueva función sea tratada como un error ortográfico.

Incluso si llama a Attack con el puntero principal, se ejecutan diferentes funciones dependiendo de si el objeto real es Warrior o Archer. Este es el polimorfismo en tiempo de ejecución.

destructor virtual

Es seguro dejar virtual el destructor de la clase principal para herencia.

virtual ~Character() = default;

Al eliminar un objeto secundario a través del puntero principal, si no hay un destructor virtual, es posible que no se llame al destructor secundario. Si el niño tiene recursos como archivos o memoria, es posible que se omita la limpieza.

Vida útil del objeto y RAII

Los objetos locales se destruyen automáticamente al final de un bloque.

void Battle()
{
    Warrior warrior{"Rose"};
    std::cout << warrior.Attack() << '\n';
} //Aquí se llama al destructor del guerrero.

El método que vincula la creación de objetos y la adquisición de recursos, y la destrucción de objetos y la liberación de recursos se llama RAII. Incluso si se realiza una devolución en medio de la función, se llama al destructor del objeto local.

buenas noches. Ahora puedes saber quién organiza qué y cuándo con solo mirar el código. por el otro ladonewydeleteSi están dispersos por todas partes, resulta difícil saber quién es el propietario.

Los objetos que requieren polimorfismo no deben almacenarse como valores en el tipo principal. std::vector<Character>Ingresar Warrior como valor puede resultar en el corte del objeto en el que se cortan las partes secundarias.

Por lo tanto, debe almacenarse en forma de puntero de la siguiente manera.

std::vector<std::unique_ptr<Character>> party;

Ahora necesitamos punteros inteligentes que permitan que los punteros limpien objetos automáticamente mientras los poseen.