在C++中,通过基类指针在容器中保存不同类型对象的核心思路是利用多态和智能指针管理动态内存。以下是具体步骤和示例:
实现步骤
- 定义抽象基类:基类至少包含一个虚函数(纯虚函数使其抽象化),并声明虚析构函数以确保正确释放派生类资源。
- 创建派生类:继承基类并重写虚函数,实现各自的具体行为。
- 使用容器存储基类指针:推荐使用
std::unique_ptr智能指针,避免手动内存管理。 - 多态调用:通过基类指针调用虚函数,根据实际对象类型执行相应方法。
示例代码
#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.
关键点说明
- 多态支持:基类声明虚函数
draw(),派生类通过override关键字重写,确保通过基类指针调用时执行实际对象的方法。 - 内存管理:使用
std::unique_ptr自动管理对象生命周期,无需手动delete,避免内存泄漏。 - 类型安全:容器
std::vector<std::unique_ptr<Shape>>确保只能存储继承自Shape的对象,编译时进行类型检查。 - 虚析构函数:基类虚析构函数确保删除基类指针时,正确调用派生类析构函数,防止资源泄漏。
通过上述方法,可以高效、安全地在容器中管理多种派生类对象,充分利用C++的多态特性。

3576

被折叠的 条评论
为什么被折叠?



