c – 将基类型的STL容器转换为派生类型是否可以?

可以将STL容器从Base类型转换为Derived类型吗?
例如,我有两个向量.第一个是Base类的类型,第二个是Derive类的类型.

class Base
{
// Code
};

class Derive : public Base
{
// Code
};

用法

    vector<Base*>*  vec_base = new vector<Base*>;

    // Add some Derive type data to vec_base

    vector<Derive*>* vec_derive = (vector<Derive*>*)(vec_base);

    // Using elements as Derive pointers. Works fine. 

这个可以吗 ? (它工作正常,但我想得到一些关于此的评论).非常感谢你.

编辑:根据答案更新.

说,如果我小心使用该向量,并且不会使用多重继承并且不会插入除Derive类型之外的对象,它可以吗? (我猜,它不是)

非常感谢你的答案.

解决方法:

这绝对不行,并且是c样式转换屏蔽错误的示例之一. “它适用于我”并不表示在这种情况下定义明确的行为.

如果你真的想这样做,我建议:

#include <vector>
#include <algorithm>
#include <iterator>

using namespace std;

class Base
{
// Code
virtual ~Base();
};

class Derrive : public Base
{
// Code
};

Derrive *convert(Base * in) {
   // assert here?
   return dynamic_cast<Derrive*>(in);
}

int main() {
    vector<Base*>*  vec_base = new vector<Base*>;

    // Add some Derrive type data to vec_base

    vector<Derrive*>* vec_derrive = new vector<Derrive*>;

    transform(vec_base->begin(), vec_base->end(), back_insert_iterator<vector<Derrive*> >(*vec_derrive), convert);
}
上一篇:c – 多态指针的typeid?


下一篇:c – 如何存储多态闭包?