如何在没有朋友或C ++的'getter'函数的情况下从派生类访问抽象私有数据?

时间:2011-02-11 06:51:36

标签: c++ access-modifiers

所以,我现在陷入了两难境地。我怎么想从派生类访问纯抽象基类私有成员变量? 我从朋友那里听说可以通过基础构造函数访问它,但他没有解释。这怎么可能? 基类中有一些继承的类。有没有办法获得对私有变量的访问权?

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();
};

我希望能够从子类

访问基类中的Rect和bool

2 个答案:

答案 0 :(得分:1)

是否可以将基类成员更改为protected?这是使子类可访问的直接方式。我不知道你的朋友指的是什么,除了派生类的构造函数调用基类的构造函数,基类的构造函数可以看到基类的private成员。

答案 1 :(得分:1)

这是不可能的。私有成员只能在定义它们的类中访问(加上其friend s),按设计

每个类都对其私有成员变量负责。如果子类需要访问它们,则必须将它们声明为protected,或者最好通过基类提供的某些publicprotected方法间接访问它们。

大多数情况下,如果你真的认为你必须能够访问基类'privates,那么这表明基类或你的子类设计不好!


<强>更新

感谢您的代码!您为什么要访问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
{
    // ...
}