2011-02-11 59 views
0

所以,我現在陷入了困境。我想如何從派生類訪問一個純粹的抽象基類私有成員變量? 我從朋友那裏聽說可以通過基礎構造函數訪問它,但他沒有解釋。這怎麼可能? 有一些來自基類的繼承類。有什麼方法可以訪問私有變量嗎?如何在沒有朋友的情況下從派生類訪問抽象私人數據或者在C++中訪問'getter'函數?

class Base_button 
{ 
    private: 
    bool is_vis; 
    Rect rButton; 

    public: 

    // Constructors 
    Base_button(); 
    Base_button(const Point &corner, double height, double width); 

    // Destructor 
    virtual ~ Base_button(); 

    // Accessors 
    virtual void draw() const = 0; 
    bool clicked(const Point &click) const; 
    bool is_visible() const; 

    // Mutators 
    virtual void show(); 
    virtual void hide(); 
    void move(const Point &loc); 
}; 

class Button : public Base_button 
{ 
    private: 
    Message mButton; 

    public: 

    // Constructors 
    Button(); 
    Button(const Point &corner, const string &label); 

    // Acessors 
    virtual void draw() const; 

    // Mutators 
    virtual void show(); 
    virtual void hide(); 
}; 

我希望能夠訪問正確,而且在布爾從子類

+0

你能不能給一個簡短的代碼示例,並解釋爲什麼你想訪問私有變量? – 2011-02-11 07:04:58

回答

1

這是不可能的。私人會員只能在定義的類別(加上其friend s),設計

每個班級全權負責其私人成員變量。如果一個子類需要訪問這些子類,則它們必須聲明爲protected,或者最好通過基類提供的某些publicprotected方法間接訪問。

大多數時候,如果你真的認爲你必須有權訪問基類的私有,這表明基類或子類的設計不好!


UPDATE

感謝您的代碼!你爲什麼要訪問rRectis_vis?我想你可以通過Base_button::is_visible()Base_button::show(),Base_button::hide()訪問後者。

如果你想要做的是通過從子類構造函數的基類的幾何信息,你確實可以調用基類的構造:

Button::Button(const Point &corner, const string &label) 
    : Base_button(corner, 100, 100) // Presumably, this initializes rRect 
{ 
    // ... 
} 
1

的基類是有可能的基類成員更改爲protected?這是使子類可訪問的直接方式。我不知道你的朋友指的是什麼,除了派生類的構造函數調用基類的構造函數,並且基類的構造函數可以看到基類的private成員。

+0

對不起,但它被限制爲'私人'類型。有沒有辦法訪問私人變量沒有朋友或獲取功能? – John 2011-02-11 06:55:08

+1

你可以在#include「BaseClass.h」``#define private protected`之前。 (只是在開玩笑,不要這樣做!);) – 2011-02-11 06:58:36

相關問題