如何从一个派生类中访问另一个派生类的成员?(涉及到it技术)

3

我有一个父类,从那个父类中又派生出两个公共派生类。例如:

                     class Parent
                       |      |
                       |      |
                       |      |
              class derived1   class derived2.

问题: 我想从一个派生类访问另一个派生类的私有成员。我该怎么做?
现在的方式如下: 将cDerived1对象作为参数传递给cDerived2的构造函数。如果我这样做,那么我必须将cDerived2声明为cDerived1的友元,并在cDerived2.h中包含cDerived1.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);  
}

我是否正确地做了这件事,还是我做错了什么非常明显的事情?

谢谢。

针对保罗的评论回应: 我已经在父类中拥有共享代码,如下所示。

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 ?

干净的方法是将共享代码推到父类中。否则,将方法设置为公共,或者像你正在做的那样使用友元语法。 - Paul Nikonowicz
如果pArr在基础内存中,你难道不能请求一个基础指针吗? - Kerrek SB
2个回答

0
这是关键字friend的用途。 它可以用于函数或类... 在这种情况下,您会将其应用于类。 访问受保护的成员的唯一方法是通过继承...即子类或友元类。 我非常确定在类外部访问私有成员的唯一方法是使用友元函数或类。 这里是一个相关链接:cplusplus.com
这是他们声明友元类的示例(第二个)。
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()


0

由于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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接