推导模板类
derivation template classes
我写了一个模板 BST class,通常的操作是这样的:
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 class 的模板红黑树 class。
红黑的class应该改写插入和删除,但是我看到模板的方法class不能是virtual,所以不知道怎么办。
如评论中所述,您实际上可以在模板 class 中包含 virtual
函数,并且可以通过派生 classes 来覆盖这些函数。
尽管恕我直言,更好的选择可能是,在这种情况下使用 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;
};
派生的 classes 必须相应地实现 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;
}
};
我写了一个模板 BST class,通常的操作是这样的:
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 class 的模板红黑树 class。 红黑的class应该改写插入和删除,但是我看到模板的方法class不能是virtual,所以不知道怎么办。
如评论中所述,您实际上可以在模板 class 中包含 virtual
函数,并且可以通过派生 classes 来覆盖这些函数。
尽管恕我直言,更好的选择可能是,在这种情况下使用 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;
};
派生的 classes 必须相应地实现 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;
}
};