我有一个父类,我有两个来自该父类的公开派生类。例如
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 ?
答案 0 :(得分: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
Derived 1可以访问Derived 2私有成员,Derived 2可以访问Derived 1私有成员。
我假设您不想简单地使用getter函数。
一旦宣布为朋友,您就可以使用:
Obj.theVar
而不是像这样使用getter函数:
Obj.getVar()
答案 1 :(得分: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);
}