派生模板类

时间:2015-02-10 18:53:19

标签: c++ templates inheritance polymorphism

我编写了一个模板BST类,其常规操作如下:

template <class Key,class T>
class BTree {
public:
   BTree():root(0){}//crea un albero vuoto
   BTree<Key,T>& treeInsert(const Key& k,const T& val);
   BTree<Key,T>& treeDelete(const Key& k);
   Node<Key,T>& treeSearch(const Key& k);
   Node<Key,T>& treeMinimum();
   void treeClear();
protected:
   BTree<Key,T>& transplant(Node<Key,T>& n1,Node<Key,T>& n2);
   Node<Key,T>* root;
};

我想实现一个继承自bst类的模板红黑树类。 红黑类应重写插入和删除,但我读到模板类的方法不能是虚拟的,因此不知道如何执行此操作。

1 个答案:

答案 0 :(得分:4)

正如评论中所提到的,你实际上可以在模板类中拥有virtual个函数,并且可以通过派生类来覆盖这些函数。


虽然恕我直言可能是更好的选择,但对于这种情况使用CRTP(又名静态多态,基于策略的设计)(因为您已经在处理模板)。它可能看起来像这样

template <class Key,class T,class Derived>
                        // ^^^^^^^^^^^^^^
class BTree {
public:
   BTree():root(0){}//crea un albero vuoto
   BTree<Key,T>& treeInsert(const Key& k,const T& val) {
       return static_cast<Derived*>(this)->doTreeInsert();
   }
   BTree<Key,T>& treeDelete(const Key& k) {
       return static_cast<Derived*>(this)->doTreeDelete();
   }
   Node<Key,T>& treeSearch(const Key& k);
   Node<Key,T>& treeMinimum();
   void treeClear();
protected:
   BTree<Key,T>& transplant(Node<Key,T>& n1,Node<Key,T>& n2);
   Node<Key,T>* root;
};

派生类必须相应地实现doTreeInsert()doTreeDelete()函数,以便编译此代码:

template <class Key,class T>
class RedBlackTree 
: public BTree<Key,T,RedBlackTree> {
public:
   BTree<Key,T>& doTreeInsert(const Key& k,const T& val) {
       // Implement the RB specifics for insert here
       return *this;
   }
   BTree<Key,T>& doTreeDelete(const Key& k) {
       // Implement the RB specifics for delete here
       return *this;
   }
};