在不实现纯虚方法的情况下对模板化类进行子类化

时间:2010-04-07 01:20:45

标签: c++ inheritance templates pure-virtual

我有以下类定义:

template<typename QueueItemT>
class QueueBC
{
protected:
    QueueBC() {}
    virtual ~QueueBC() {}

private:
    virtual IItemBuf* constructItem(const QueueItemT& item) = 0;
} 

我创建了以下子类:

class MyQueue
    : public QueueBC<MyItemT>
{
public:

    MyQueue() {}
    virtual ~MyQueue() {}
};

这在VS2005下编译得很好,但我没有在constructItem()类中实现MyQueue。知道为什么吗?

4 个答案:

答案 0 :(得分:5)

尝试使用它:

MyQueue m;

您不能实例化抽象类,但您可以定义一个(显然,就像您定义的QueueBC)。 MyQueue同样抽象。

例如:

struct base // abstract
{
    virtual void one() = 0;
    virtual void two() = 0;
};

struct base_again : base // just as abstract as base
{
};

struct foo : base_again // still abstract
{
    void one() {}
};

struct bar : foo // not abstract
{
    void two() {}
};

答案 1 :(得分:2)

它将编译,但您无法创建实例。 MyQueue被认为是抽象的。

答案 2 :(得分:2)

你的MyQueue子类也是抽象的,就像它的基类一样:因此,它不能实例化,而只是定义它(这是你所做的一切都很好!

答案 3 :(得分:1)

它编译得很好,因为编译器不知道你打算如何使用MyQueue类。你定义它的方式,MyQueue也是一个抽象类。如果您尝试仅使用它,则会出现编译错误