3

是否可以进行标题中描述的操作?这是我想做的一个具体例子:

#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 也不起作用。有没有好的方法来做到这一点?否则,我如何将派生类对象的向量作为基类对象的向量进行迭代?

4

2 回答 2

3

您不能将它们一起转换。

我认为你需要这样的东西:

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

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

// ....

// cleanup 

进而享受多态性优势。

于 2013-03-13T20:19:46.263 回答
2

不,类型无关。

如果您想公开一系列Base对象,隐藏它们实际上是 的事实Derived,您可以使用boost::iterator_adaptor. 结果类型不是vector<Base>::iterator,但它是一个迭代器,Base在取消引用时会给出 a 。

#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。)

于 2013-03-13T20:14:54.960 回答