c++ - 从基类模板列表中实例化子类对象

标签 c++ templates visual-c++ c++11

我正在尝试制作一个模板对象列表,这些模板对象是在基类的不同子类之后模板化的。我知道列表不能是异构的,所以在这些基类列表之后对我的模板列表进行类型定义。

检查下面的基本代码。当我尝试从模板中实例化实现时,问题就来了,因为它仍然假设我使用的是抽象基类,即使我已经在模板参数中传递了它的子类。

这一切都在标题中完成。

// 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

导致这两个错误的原因是什么?有什么方法可以使它起作用吗?

最佳答案

有几个问题。

  1. MyTemplate<MyBase>不是 MyTemplate<MySub_One> 的基类

  2. 您正在尝试添加类型为 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/

相关文章:

c++ - 使用 Boost 图库的 adjacency_matrix

c++ - spirit qi no_case 指令应用于文法

c++ - 在编译时迭代函数参数类型

c++ - 确保模板函数不会对某些类型采用特定的 if-else-branch

c++ - 我怎样才能让 OnLButtonDown() 事件中的进程一次又一次地发生,直到我按下按钮?

c++ - for 循环中的动态数组分配会引发错误

c++ - 如何在C++中创建虚拟存储空间?

c++ - 构造函数特化要求

.net - 警告 MSB8004 : Output Directory does not end with a trailing slash.

c++ - 在其他实现文件中包含实现文件有什么用?