template <typename T>
class BaseQueue
{
    public :
    virtual void push_back(T value) = 0;
    //other  virtual methods
};

template <typename T>
class BaseDeque: public virtual BaseQueue<T>
{
    public:
        virtual void push_front(T value) = 0;
        //other virtual methods
};

//Realisation
template <typename T>
class VectorQueue: public BaseQueue<T>
{
    typedef typename std::vector<T> array;
    private: array adata;
    public:
    VectorQueue()
    {
       adata = array();
    }

    void push_back(T value)
    {
        adata.push_back(value);
    }
};

template <typename T>
class VectorDeque: virtual public VectorQueue<T>, virtual protected BaseDeque<T>//,
{
    void push_front(T value)
    {
        VectorQueue::adata.push_front(value);
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    VectorDeque<int> vd = VectorDeque<int>();//here is a error

    int i;
    std::cin >> i;
    return 0;
}

我有这样的错误:“C2259:'VectorDeque':无法实例化抽象类...”。我该如何解决? VectorQueue类已经实现了BaseQueue类的每个虚拟方法。但是编译器不知道。我看到的唯一方法是编写如下内容:
template <typename T>
class VectorDeque: virtual public VectorQueue<T>, virtual protected BaseDeque<T>//,
{
    void push_front(T value)
    {
        VectorQueue::adata.push_front(value);
    }
    void push_back(T value)
    {
        VectorQueue::push_back(value);
    }
    //repeat it fo every virtual method of BaseQueue class (interface)
};

但这太可怕了。

最佳答案

push_back中的BaseQueue没有在继承链的BaseDeque端实现,因此,最 child 的类仍然是抽象的。

我认为您正在尝试在此处强加不应该存在的类关系。请注意,在标准库dequevector中是如何区分不同的容器类型的,而queue之类的东西则使这些容器适应非常精确的接口(interface),而不是尝试继承。

08-28 19:11