是否可以将具有Base类型的STL容器转换为Derived类型?

Mor*_*eus 5 c++ polymorphism stl vector

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

class Base
{
// Code
};

class Derive : public Base
{
// Code
};
Run Code Online (Sandbox Code Playgroud)

用法

    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. 
Run Code Online (Sandbox Code Playgroud)

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

编辑:根据答案更新.

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

非常感谢你的答案.

Fle*_*exo 9

这绝对不行,并且是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);
}
Run Code Online (Sandbox Code Playgroud)

  • 遗憾的是,dynamic_cast不是一个函数,因为那时你可能根本不需要convert函数来包装dynamic_cast. (2认同)