2013-03-13 148 views
2

是否可以執行標題中描述的操作?下面是我想要做的具體示例:將矢量<derived> :: iterator轉換爲矢量<base> :: iterator

#include <vector> 
class Base{ 
public: 
    Base(int t){tst = t;} 
protected: 
    int tst; 
}; 

class Derived : public Base{ 
public: 
    Derived(int t):Base(t){} 
}; 

int main(){ 
    std::vector<Derived> test; 
    test.push_back(Derived(1)); 
    std::vector<Base>::iterator iTest = test.begin(); 
} 

最後一行失敗。使用static_cast也不起作用。有沒有一個好的方法來做到這一點?我該如何迭代派生類對象的向量作爲基類對象的向量呢?

回答

3

您不能轉換在一起。

我想你需要的東西是這樣的:

std::vector<Base*> test; 
test.push_back(new Derived(1)); 

std::vector<Base*>::iterator iTest = test.begin(); 

// .... 

// cleanup 

再享受多態性優勢。

+0

這是我最大的監督之處。我曾想過在這個問題的不同背景下這樣做,但不是目前的問題。謝謝! – 2013-03-13 20:26:16

+0

注意,如果您使用的是C++ 11,可以這樣寫同樣的迭代(使用多態): *** for(Base&base:vectorOfDerived)***(如果從begin()迭代到結束()而不移動或添加元素) – 2013-03-13 21:02:42

1

不是,類型是不相關的。

如果你想公開一個Base對象序列,隱藏事實上它們實際上是Derived,你可以用boost::iterator_adaptor來做。結果類型不是vector<Base>::iterator,但它是一個迭代器,取消引用時會給出Base

#include <boost/iterator/iterator_adaptor.hpp> 

class BaseIter 
    : public boost::iterator_adaptor< 
     BaseIter,       // This class type for CRTP 
     std::vector<Derived>::iterator, // Underlying iterator type 
     Base >       // Desired value_type 
{ 
public: 
    BaseIter() 
     : iterator_adaptor() {} 
    explicit BaseIter(std::vector<Derived>::iterator iter) 
     : iterator_adaptor(iter) {} 
}; 

(你可能想const Base而不是Base作爲value_type。)