【问题标题】:How to access the members of a derived class from another derived class?如何从另一个派生类访问派生类的成员?
【发布时间】:2012-03-05 08:19:08
【问题描述】:

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

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

问题: 我想从另一个派生类访问一个派生类的私有成员。我该怎么做呢?

我现在的方式如下: 将 cDerived1 对象作为参数传递给 cDerived2 的 ctor。如果我这样做,那么我必须将 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 ?

【问题讨论】:

  • 干净的方法是将共享代码推送到父类。否则,将方法公开或使用您正在做的朋友语法
  • 如果pArr 住在基地里,你就不能要求一个基地指针吗?

标签: c++ class derived


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这就是关键字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
    

    Derived 1 可以访问 Derived 2 私有成员,而 Derived 2 可以访问 Derived 1 私有成员。

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

    一旦它被宣布为朋友,你就可以使用:

    Obj.theVar

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

    Obj.getVar()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      相关资源
      最近更新 更多