gpt4 book ai didi

c++ - 派生模板类

转载 作者:行者123 更新时间:2023-11-30 01:49:47 25 4
gpt4 key购买 nike

我编写了一个模板 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 类的模板红黑树类。红黑类应该重写插入和删除,但是我看到模板类的方法不能是虚函数,所以不知道该怎么做。

最佳答案

如评论中所述,您实际上可以在模板类中拥有 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;
}
};

关于c++ - 派生模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28439532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com