可以将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);
}