我已经关注了代码,并希望将MyClass<int>,MyClass<float>
...存储在vector<BaseClass> mItems
中,然后恢复原始类。
我试图弄清楚C ++中是否存在从基类转换为模板化类的方法,但现在我仍然无法找到如何做到的方法。
MyClass<int> lRecover1 = dynamic_cast<MyClass<int>>(mItems.at(0));
这不会编译,我也不明白为什么。如果有帮助,这是我的代码:
#include <vector>
class BaseClass
{
public:
virtual ~BaseClass() {}
};
template<typename T>
class MyClass : public BaseClass
{
public:
MyClass()
{
}
~MyClass()
{
}
};
void main()
{
std::vector<BaseClass> mItems;
MyClass<int> lItem1, lItem2;
MyClass<float> lItem3, lItem4, lItem5;
MyClass<double> lItem6, lItem7;
//PROBLEM: I would like to recover the original class
MyClass<int> lRecover1 = dynamic_cast<MyClass<int>>(mItems.at(0));
}
答案 0 :(得分:2)
BaseClass
个实例的向量只包含值BaseClass
的实际实例。 BaseClass*
个实例的向量将包含指向BaseClass
或其任何子节点的指针。
std::vector<BaseClass*> items;
...
MyClass<int>* recover = dynamic_cast<MyClass<int>*>(items.at(0));
当您处理子类的可能性时,您必须始终使用指针或引用来建立间接层。 (在这种情况下你必须使用指针,因为引用不能存储在std::vector
)
特别是,如果您尝试将MyClass<int>
实例存储在std::vector<BaseClass>
类型的容器中,C ++将尝试使用BaseClass
的副本将实例复制到向量中构造函数。这将导致BaseClass
复制它所知道的数据并且无法复制子类信息,从而有效地丢失了额外的数据,这个问题通常被称为object slicing。