Шаблонный класс подклассов без реализации чисто виртуального метода - PullRequest
0 голосов
/ 07 апреля 2010

У меня есть следующее определение класса:

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 ]

5 голосов
/ 07 апреля 2010

Попробуйте использовать его:

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() {}
};
2 голосов
/ 07 апреля 2010

Ваш MyQueue подкласс также является абстрактным, как и его базовый класс: следовательно, он не может быть созданным , а просто определяющим это (что все, что вы сделано) отлично!

2 голосов
/ 07 апреля 2010

Он скомпилируется, но вы не можете создавать экземпляры. MyQueue считается абстрактным.

1 голос
/ 07 апреля 2010

Это скомпилируется нормально, потому что компилятор не знает, как вы собираетесь использовать класс MyQueue. Как вы определили, MyQueue также является абстрактным классом. Если вы попытаетесь использовать его только тогда, вы получите ошибку компиляции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...