c++ - 从具有私有(private)内部类 C++ 的类继承

标签 c++ class inheritance tree avl-tree

所以我有一个作业需要使用秩二叉树。不久前我已经实现了一个模板 AVL 树 (C++),所以我想将其用作基础并添加到其中。 由于我不想重复代码并使用我已有的代码,我想制作一个将从 AVL 继承的排名树类。 我如何使用我所拥有的创建模板等级 AVL 树? 有没有办法创建一个内部 RankNode 类并让它继承自 AVL 的私有(private) Node 类?

/* AvlTree class */
template<typename KeyType, typename DataType>
class AvlTree {
    class AvlTreeNode;
    AvlTreeNode* root;
    int treeSize;

    void clearTree(AvlTreeNode* node);
    void updateBF(AvlTreeNode*& node); //updates the BF of the nodes from the root to the given node
    void updateHeight(AvlTreeNode*& node); //updates the height of the nodes from the root to the given node
    void balanceTree(AvlTreeNode*& node);
    void rotateLeft(AvlTreeNode*& node);
    void rotateRight(AvlTreeNode*& node);
    void insertFrom(const KeyType& key, const DataType& data, AvlTreeNode*& node);
    AvlTreeNode*& findNext(AvlTreeNode*& node, AvlTreeNode*& current,AvlTreeNode*& father);
    AvlTreeNode*& treeNav(AvlTreeNode*& node);
    void deleteLeaf(AvlTreeNode*& node);
    void deleteOneSon(AvlTreeNode*& node);
    void deleteTwoSons(AvlTreeNode*& node);
    void removeFromTree(const KeyType& key, AvlTreeNode*& node);
    AvlTreeNode* find(KeyType key, AvlTreeNode*& node);
    void inOrderAux(KeyType** keys, AvlTreeNode*& node, int& i);
    void inOrderRangedAux(KeyType** keys, AvlTreeNode*& node, const KeyType& start,const KeyType& end, int& i);
    void inOrderRangedCountAux(AvlTreeNode*& node, const KeyType& start,const KeyType& end, int& i);

public:
    AvlTree();
    virtual ~AvlTree();
    //AvlTree(const AvlTree& tree);
    DataType getData(const KeyType& key);
    void setData(const KeyType& key, const DataType& data);
    void insert(const KeyType& key, const DataType& data);
    void remove(const KeyType& key);
    void inOrder(int* size, KeyType** keys); //Gets all of the values in a Keyarray inorder
    void inOrderRanged(int* size, KeyType** keys,const KeyType& start,const KeyType& end);
    bool exists(const KeyType& key);
} ;

/* AvlTreeNode class */
template<typename KeyType, typename DataType>
class AvlTree<KeyType,DataType>::AvlTreeNode {
    KeyType key;
    DataType data;
    int bf;  
    int height; //The subtree's height
    AvlTreeNode* left;
    AvlTreeNode* right;
    AvlTreeNode(KeyType key, DataType data, AvlTreeNode* left = NULL, AvlTreeNode* right = NULL):key(key), data(data), bf(0),height(0), left(left), right(right){}
    ~AvlTreeNode(){}
    friend class AvlTree<KeyType, DataType>;
};

编辑:我找到了我要找的答案。我需要的代码如下所示:

template<typename T>
class A{
protected:
    class B{


    };
};

template<typename T>
class C : A{
protected:
    class D :A<T>::B{

    };
};

最佳答案

您可以将新类标记为 base 的 friend(坏主意,设计明智),或者使这些私有(private)成员 protected (这就是 protected 的用途,毕竟)。

至于为什么 friend 在这里不是最好的主意:一方面,基类不应该关心派生类。其次,如果你想扩展某些东西,那么最初(或追溯)应该使某些东西可扩展;也就是说,它应该将可能暴露给派生类的成员标记为protected。否则,类(class)被锁定;因此,它发送了一个简单的信号:我的原创者不希望我延长

关于c++ - 从具有私有(private)内部类 C++ 的类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14148154/

相关文章:

c++ - NTL 上的 "Polynomial too big for FFT"错误

c++ - Android Studio 2.2链接opencv静态库

c++ - 等待所有线程完成一项工作然后再做另一项

java - 选择正确的类(从名词)来构建我的项目

c++ - 消除左递归后的精神语义 Action

php需要从内部方法调用类

powershell - 如何使用 PowerSell 获取类提供的验证参数类

postgresql - 如何在 PostgreSQL 中以编程方式查找继承表?

java - 为什么调用父类方法?

javascript - 重用在 Controller 之间定义的功能