百分请问:C++友元、继承、私有成员访问有关问题

百分请教:C++友元、继承、私有成员访问问题
准备写AVL树代码,但是现在被搞糊涂了。
准备是AVLTree公有继承BTree,而大家都知道,另外肯定还有一个BNode,是作为BTree的节点类,其中BTree为BNode的友元,而BNode中的元素都是private的。

这样就出现麻烦了,因为AVLTree的节点中还需要一个平衡因子bf,这样就不能使用BNode,所以就建立一个AVLNode来公有继承BNode。AVLTree为AVLNode的友元类。

现在的麻烦就是AVLTree无法访问BNode的private变量,因为友元的不可传递、不可继承性。

但是我就有概念上的不清楚,是否在BNode中申明AVLTree为其友元类就可以了呢?这样有没有其他问题?

友元是对于类来说的,还是对于实例来说的,不能访问的东西继承了有什么用呢?

------解决方案--------------------
你可以把BNode定义为一个结构体
然后在BTree中包含一个BNode的成员变量
------解决方案--------------------
BNode还是不做友元吧。
层次结构分明。
------解决方案--------------------
楼主看看这样如何?

#include <iostream>
using namespace std;

class BNode
{
friend class BTree;
public:
BNode()
{
value = 1;
}

private:
int value;
};

class AVL_Node : public BNode
{
friend class AVL_Tree;
public:
AVL_Node() :
BNode()
{
bf = 1;
};
private:
int bf;
};

class BTree
{
private:
BNode bNode;
public:
void test(void)
{
bNode.value;
};
public:
int GetValue(AVL_Node tmp)
{
return tmp.value;
}

void SetValue(AVL_Node &tmp, int value)
{
tmp.value = value;
}
};

class AVL_Tree : public BTree
{
private:
AVL_Node avlNode;
public:
void test(void)
{
cout < < avlNode.bf < < endl;
SetValue(avlNode, 5);
cout < < GetValue(avlNode) < < endl;
}
};

// ============================================================================
// ==============================================================================

int main()
{
//~~~~~~~~~~~~~
AVL_Tree avlTree;
//~~~~~~~~~~~~~

avlTree.test();
return 0;
}

------解决方案--------------------
对于楼主的这个问题,只要把BNode里的数据声明为protected就行了

至于友元,也不能说没用,因为楼主现在设计的是继承关系.所以protected才可以正常工作/

而如果是两个不相关的类之间,一个类想调用另一个类的私有成员的话,那就只能将这个类声明为

它的友元类了.


所以楼主好像是把继承和友元混在一起了.其实它们也是分开的两回事.

继承之后,子类想用父类的东西,就把父类的东西声明为protected就行了.

而不是继承关系的两个类,一个类想用另一个类的私有,就要友元了.