首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

容器中存放虚基类指针,用迭代器遍历产生异常,呼唤大神前辈们的指导呀!

2013-03-04 
容器中存放虚基类指针,用迭代器遍历产生错误,呼唤大神前辈们的指导呀!!!小弟练习做多态的练习,将new出来继

容器中存放虚基类指针,用迭代器遍历产生错误,呼唤大神前辈们的指导呀!!!
小弟练习做多态的练习,将new出来继承类的地址存在虚基类的指针中,然后将指针用vector存放,之后尝试用迭代器遍历,遇到编译错误error: conversion from '__gnu_cxx::__normal_iterator<ExprNode* const*, std::vector<ExprNode*, std::allocator<ExprNode*> > >' to non-scalar type '__gnu_cxx::__normal_iterator<ExprNode**, std::vector<ExprNode*, std::allocator<ExprNode*> > >' requested
 小弟于是尝试下面第二中遍历方法,编译便不报错了,小弟好奇,很想知道其中原因,请大神们帮助解答呀!!容器中存放虚基类指针,用迭代器遍历产生异常,呼唤大神前辈们的指导呀!
小弟只粘贴了部分代码(基类和继承类的声明和定义都省去了,感觉问题就是在迭代器上

for (vector<ExprNode*>::iterator it = un.myPtrVec.begin(); it != un.myPtrVec.end(); ++it) {
            NumNode* tempI = dynamic_cast<NumNode*>(*it);
            UnaryNode* tempU = dynamic_cast<UnaryNode*>(*it);
            BinaryNode* tempB = dynamic_cast<BinaryNode*>(*it);
            MutiaryNode* tempM = dynamic_cast<MutiaryNode*>(*it);


for (unsigned i = 0; i < myPtrVec.size(); ++i) {
        NumNode* tempI = dynamic_cast<NumNode*>(myPtrVec[i]);
        UnaryNode* tempU = dynamic_cast<UnaryNode*>(myPtrVec[i]);
        BinaryNode* tempB = dynamic_cast<BinaryNode*>(myPtrVec[i]);
        MutiaryNode* tempM = dynamic_cast<MutiaryNode*>(myPtrVec[i]);

[解决办法]
模仿LZ的思路貌似也没什么问题。

# include <iostream>
# include <vector>

using namespace std;

class Foo {
public:
    virtual void bar() = 0;
    virtual ~Foo() {};
};

class A : public Foo {
    void bar() { cout << "A\n"; }
};

class B : public Foo {
    void bar() { cout << "B\n"; }
};

int main()
{
    vector<Foo *> v;
    v.push_back(new A);
    v.push_back(new B);

    for (vector<Foo *>::iterator it = v.begin(); it != v.end(); ++it)
    {
        Foo * p = *it;
        p->bar();
        delete p;
    }

    return 0;
}

热点排行