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
相关产品推荐
相关产品推荐

