如果我们想使用基类指针迭代指向的派生类对象,我们需要在基类中声明返回迭代器的虚函数begin和end,然后在派生类中实现begin和end,这样我们就可以使用基类指针指向派生类后使用其迭代器了。
#include<iostream>
#include<vector>using namespace std;// 基类
class Base {
public:// 声明返回迭代器的虚函数virtual vector<int>::iterator begin() = 0;virtual vector<int>::iterator end() = 0;
};// 派生类
class Derived : public Base {
public:Derived(vector<int> data): data_(data) {}// 覆盖虚函数 begin()vector<int>::iterator begin() override {return data_.begin();}// 覆盖虚函数 end()vector<int>::iterator end() override {return data_.end();}
private:vector<int> data_;
};int main () {// 隐式构造Derived d = vector<int>{1, 2, 3, 4, 5};// 基类获取派生类指针Base* b = &d;// 使用迭代器 方式1for(auto it = b->begin(); it != b->end(); it++) {cout << *it << " ";}cout << endl;// 使用迭代器 方式2for(auto it: *b) {cout << it << " ";}cout << endl;
}