You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中使用迭代器访问存储父类指针的vector元素技术问询

实现迭代器访问存有多态对象指针的vector

我来帮你搞定这个问题!首先咱们先把你给出的代码补全完整,加上三个子类并修正成员访问权限,然后实现用迭代器遍历vector<Vehicle*>,让多态的print_info()正确执行。

完整代码实现

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
using namespace std;

class Vehicle {
protected: // 改为protected,让子类可以访问成员变量
    int wheels, max_speed;
    string model;
public:
    // 构造函数,初始化车辆属性
    Vehicle(int w, int ms, string m) : wheels(w), max_speed(ms), model(m) {}

    // 虚函数,确保子类重写后触发多态
    virtual void print_info() {
        cout << "This is a Vehicle: Model " << model << ", Wheels: " << wheels << ", Max Speed: " << max_speed << endl;
    }

    // 虚析构函数,保证子类对象能正确释放
    virtual ~Vehicle() {}
};

// 子类:汽车
class Car : public Vehicle {
public:
    Car(int ms, string m) : Vehicle(4, ms, m) {}

    // 重写print_info,实现汽车专属输出
    void print_info() override {
        cout << "This is a Car: Model " << model << ", Wheels: " << wheels << ", Max Speed: " << max_speed << endl;
    }
};

// 子类:自行车
class Bike : public Vehicle {
public:
    Bike(int ms, string m) : Vehicle(2, ms, m) {}

    void print_info() override {
        cout << "This is a Bike: Model " << model << ", Wheels: " << wheels << ", Max Speed: " << max_speed << endl;
    }
};

// 子类:卡车
class Truck : public Vehicle {
public:
    Truck(int ms, string m) : Vehicle(6, ms, m) {}

    void print_info() override {
        cout << "This is a Truck: Model " << model << ", Wheels: " << wheels << ", Max Speed: " << max_speed << endl;
    }
};

int main() {
    // 创建存储Vehicle指针的vector
    vector<Vehicle*> vehicles;

    // 添加各类车辆对象的指针
    vehicles.push_back(new Car(200, "Tesla Model 3"));
    vehicles.push_back(new Bike(30, "Mountain Bike"));
    vehicles.push_back(new Truck(120, "Volvo FH"));

    // 方式1:使用普通迭代器遍历
    cout << "=== 普通迭代器遍历 ===" << endl;
    vector<Vehicle*>::iterator it;
    for (it = vehicles.begin(); it != vehicles.end(); ++it) {
        // 解引用迭代器得到指针,调用print_info
        (*it)->print_info();
    }

    // 方式2:用auto简化迭代器定义(C++11+)
    cout << "\n=== auto迭代器遍历 ===" << endl;
    for (auto iter = vehicles.begin(); iter != vehicles.end(); ++iter) {
        (*iter)->print_info();
    }

    // 方式3:范围for循环(底层也是迭代器,C++11+)
    cout << "\n=== 范围for循环遍历 ===" << endl;
    for (auto vehicle_ptr : vehicles) {
        vehicle_ptr->print_info();
    }

    // 必须释放内存!避免内存泄漏
    for (auto vehicle_ptr : vehicles) {
        delete vehicle_ptr;
    }
    vehicles.clear();

    return 0;
}

关键细节说明

  • 多态实现:父类的print_info()必须声明为virtual,子类用override关键字明确重写,这样通过父类指针调用时,会自动执行对应子类的函数逻辑。
  • 迭代器使用:vector<Vehicle*>::iterator是迭代器类型,解引用迭代器(*it)得到的是Vehicle*指针,所以要用->来调用成员函数。
  • 内存管理:因为我们用new创建了堆对象,所以必须在程序结束前遍历vector,用delete释放每个对象的内存;同时父类必须定义虚析构函数,确保子类的析构函数能被正确调用。
  • 成员访问权限:把父类的成员从private改为protected,这样子类可以直接访问这些属性,避免写一堆getter方法的麻烦(如果不想暴露成员,也可以用getter,这里是简化实现)。

内容的提问来源于stack exchange,提问作者Foivos Allayiotis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:34:50