【问题标题】:Instantiating subclass objects from baseclass-templated list从基类模板列表中实例化子类对象
【发布时间】:2015-01-15 21:06:32
【问题描述】:

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

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

这一切都在标题中完成。

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

是什么导致了这两个错误?有什么办法可以做到吗?

【问题讨论】:

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


    【解决方案1】:

    有几个问题。

    1. MyTemplate&lt;MyBase&gt; 不是MyTemplate&lt;MySub_One&gt; 的基类

    2. 您正在尝试将 MyTemplate&lt;MySub_One&gt;* 类型的指针添加到应该包含 MyTemplate&lt;MyBase&gt; 类型的对象列表的列表中。

    你需要这样的东西:

    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>() );
    

    【讨论】:

    • 1.这实际上是一个错字——原来是一个指针列表。将指针添加到上述代码没有任何区别。但是... 2. 我会尝试一下 - 看起来很有希望。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 2022-08-22
    • 2016-06-13
    • 1970-01-01
    相关资源
    最近更新 更多