2012-02-13 162 views
3

我有一個父類,我有2個來自該父類的公共派生類。例如。如何從另一個派生類訪問派生類的成員?

     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 ? 
+0

乾淨的方法是將共享代碼推送到父類。否則,使方法公開或使用你正在做的朋友語法 – 2012-02-13 22:18:51

+0

如果'pArr'住在基地中,難道你只是要求基地指針嗎? – 2012-02-13 22:58:34

回答

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

由於帕爾是在基類中,你無需定義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); 
} 
相關問題