我正在尝试制作一个模板对象列表,这些模板对象是在基类的不同子类之后模板化的。我知道列表不能是异构的,所以在这些基类列表之后对我的模板列表进行类型定义。
检查下面的基本代码。当我尝试从模板中实例化实现时,问题就来了,因为它仍然假设我使用的是抽象基类,即使我已经在模板参数中传递了它的子类。
这一切都在标题中完成。
// Base Class
class MyBase {
public:
MyBase(int a) {}
virtual void Print() = 0;
};
// Subclass ONE
class MySub_One :
public MyBase
{
public:
MySub_One(int a)
: MyBase(a) {}
virtual void Print() override { printf("Sub One\n"); }
};
// Subclass TWO
class MySub_Two :
public MyBase
{
public:
MySub_Two(int a)
: MyBase(a) {}
virtual void Print() override { printf("Sub Two\n"); }
};
// Template Class
template <class T>
class MyTemplate
{
int numPrint;
void CreateAndPrint()
{
T* obj = new T(0); // Compiler says, "error C2259: 'MyBase' Cannot instantiate abstract class."
obj = dynamic_cast<MyBase>( obj );
obj->Print();
}
};
当我稍后将子类对象添加到基类列表时,也有一个问题:
list<MyTemplate<MyBase>*> testList = list<MyTemplate<MyBase>*>();
testList.push_back( new MyTemplate<MySub_One>() ); // This is a problem too
导致这两个错误的原因是什么?有什么方法可以使它起作用吗?
最佳答案
有几个问题。
MyTemplate<MyBase>
不是MyTemplate<MySub_One>
的基类您正在尝试添加类型为
MyTemplate<MySub_One>*
的指针到应该包含MyTemplate<MyBase>
类型对象列表的列表.
你需要这样的东西:
class TemplateBase
{
public:
virtual void CreateAndPrint() = 0;
};
template <class T>
class MyTemplate : public TemplateBase
{
public:
virtual void CreateAndPrint()
{
T* obj = new T(0);
obj->Print();
}
};
list<TemplateBase*> testList;
testList.push_back( new MyTemplate<MySub_One>() );
关于c++ - 从基类模板列表中实例化子类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27972980/