C++ 如何从另一个派生类访问派生类的成员?

C++ 如何从另一个派生类访问派生类的成员?,c++,class,derived,C++,Class,Derived,我有一个父类,我有两个从该父类公开派生的类。例如 class Parent | | | | | | class derived1 class derived2. 问题: 我想从另一个派生类访问一个派生类的私有成员。我该怎么做 我现在的做法如下: 将cDer

我有一个父类,我有两个从该父类公开派生的类。例如

                     class Parent
                       |      |
                       |      |
                       |      |
              class derived1   class derived2.
问题: 我想从另一个派生类访问一个派生类的私有成员。我该怎么做

我现在的做法如下: 将cDerived1对象作为参数传递给cDerived2的ctor。如果我这样做,那么我必须声明cDerived2是cDerived1的朋友,并将cDerived1.h包含在cDerived2.h中

#include cParent.h
#include cDerived1.h
#include cDerived2.h

void main (){

// Instantiate a cDerived1 object
Derived1 dev1();

// Instantiate a cDerived2 object. The cDerived2 object will need access to the   
// private members of cDerived1. So pass dev1 by reference to dev2 ctor.
Derived2 dev2(dev1);  
}
这是正确的方法还是我做了一些非常明显的错误

谢谢

针对Paul的评论: 我已经在父类中有了共享代码,如下所示

cParent.h
class cparent{

public:
// ctor
// dtor
protected:
int* pArr;
};

 cDerived1.h
// derived1's header
#include "cParent.h"

class cDerived1 : public cParent{
public:
//
};


 cDerived2.h
// derived2's header
#include "cParent.h"
class cDerived2 : public cParent{
public:
// I want access to derived1's pArr member over here....How do I do this ?

这就是关键字
friend
的用途。它可以用于函数或类……在这种情况下,您可以将其应用于类。访问受保护成员的唯一方法是通过继承…即。子类或朋友类。我很确定访问类外私有成员的唯一方法是使用友元函数或类。这里是一个相关的链接

下面是他们声明friend类的示例(第二个示例)

class CSquare {
  private:
    int side;
  public:
    void set_side (int a)
      {side=a;}
    friend class CRectangle;  // here is the friend declaration 
};
因此,在您的示例中,您将使用:

friend class Derived1; // place in Derived2 

friend class Derived2; // place in Derived1
派生1可以访问派生2个私有成员,派生2可以访问派生1个私有成员

我假设您不想简单地使用getter函数

声明为好友后,您可以使用:

Obj.theVar

而不是像这样使用getter函数:


Obj.getVar()

因为pArr在基类中,所以不需要定义cDerived1就可以实现这一点。将cDerived1的对象作为cparent类的指针传递,一切都会正常。下面是一些示例代码

// cDerived2.h
// derived2's header
#include "cParent.h"
class cDerived2 : public cParent{
public:
// I want access to derived1's pArr member over here....How do I do this ?
void AccessPArr(cparent* pParent)
{
// access over here
}

int main()
{
cDerived1 der1;
cDerived2 der2;

der2.AccessPArr(&der1);
}

干净的方法是将共享代码推送到父类。否则,将这些方法公开,或者像您正在做的那样使用友元语法。如果
pArr
生活在基中,您就不能请求一个基指针吗?