2011-02-11 25 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

相关问题