c++ 通过基类指针在容器中保存不同类型对象

在C++中,通过基类指针在容器中保存不同类型对象的核心思路是利用多态和智能指针管理动态内存。以下是具体步骤和示例:

实现步骤

  1. 定义抽象基类:基类至少包含一个虚函数(纯虚函数使其抽象化),并声明虚析构函数以确保正确释放派生类资源。
  2. 创建派生类:继承基类并重写虚函数,实现各自的具体行为。
  3. 使用容器存储基类指针:推荐使用std::unique_ptr智能指针,避免手动内存管理。
  4. 多态调用:通过基类指针调用虚函数,根据实际对象类型执行相应方法。

示例代码

#include <iostream>
#include <memory>
#include <vector>

// 基类:抽象类,含纯虚函数
class Shape {
public:
    virtual void draw() const = 0; // 纯虚函数
    virtual ~Shape() = default;    // 虚析构函数
};

// 派生类 Circle
class Circle : public Shape {
public:
    void draw() const override {
        std::cout << "Drawing a circle.\n";
    }
};

// 派生类 Rectangle
class Rectangle : public Shape {
public:
    void draw() const override {
        std::cout << "Drawing a rectangle.\n";
    }
};

int main() {
    // 使用智能指针容器存储不同类型的Shape对象
    std::vector<std::unique_ptr<Shape>> shapes;

    // 向容器中添加派生类对象
    shapes.push_back(std::make_unique<Circle>());
    shapes.push_back(std::make_unique<Rectangle>());

    // 多态调用draw方法
    for (const auto& shape : shapes) {
        shape->draw();
    }

    return 0;
}

输出结果

Drawing a circle.
Drawing a rectangle.

关键点说明

  1. 多态支持:基类声明虚函数draw(),派生类通过override关键字重写,确保通过基类指针调用时执行实际对象的方法。
  2. 内存管理:使用std::unique_ptr自动管理对象生命周期,无需手动delete,避免内存泄漏。
  3. 类型安全:容器std::vector<std::unique_ptr<Shape>>确保只能存储继承自Shape的对象,编译时进行类型检查。
  4. 虚析构函数:基类虚析构函数确保删除基类指针时,正确调用派生类析构函数,防止资源泄漏。

通过上述方法,可以高效、安全地在容器中管理多种派生类对象,充分利用C++的多态特性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值