Наследование от класса с закрытыми внутренними классами Stack Overflow

Итак, у меня есть задание, в котором мне нужно использовать ранговое двоичное дерево. Я уже реализовал дерево шаблонов AVL (C ++) некоторое время назад, поэтому я решил использовать его в качестве основы и добавить к нему.
Поскольку я не хочу дублировать код и работать с тем, что у меня есть, я подумал о создании класса дерева рангов, который будет наследоваться от AVL.
Как я могу использовать то, что у меня есть, чтобы создать шаблон AVL дерево ранга?
Есть ли способ создать внутренний класс RankNode и наследовать его от частного класса Node AVL?

/* 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{

};
};

0

Решение

Вы можете пометить новый класс как friend базы (плохая идея, дизайн), или сделать этих частных членов защищенными (вот что protected в конце концов).

Почему friend здесь не лучшая идея: во-первых, базовый класс не должен заботиться о производных классах. Во-вторых, если вы хотите что-то расширить, то это нужно изначально (или задним числом) сделать расширяемым; то есть он должен помечать элементы, которые могут быть выставлены производным классам, как protected, В противном случае класс заблокирован; как таковой, он посылает простой сигнал: Мой оригинальный создатель не хотел, чтобы я продлил.

4

Другие решения

Других решений пока нет …