如果仅存在私有函数,则访问基类中的私有数据类型

时间:2015-02-11 22:26:34

标签: c++ inheritance private

根据下面的代码,如果base中的函数使用继承来保护,我们可以访问基类的私有数据。我的问题是,如果基类中的所有方法都设置为私有,我们是否可以访问私有数据?

class Base

{
int i;

protected:
  void set(int data){
      i = data;
  }
  int get(){
      return i;
  }
};

class derive: Base{
public:
    void change(int x){
        set(x);
        cout<<get()<<endl;
    }
};

int main()
{
   derive b;
   b.change(3);
   return 0;    
}

3 个答案:

答案 0 :(得分:2)

“如果base中的函数使用继承保护,我们可以访问基类的私有数据”,不是你真的没有访问私有数据。您正在调用基类中的setter来为您执行此操作。不,你不能调用基类的私有方法。

答案 1 :(得分:0)

在基类中将成员设置为private将使其对所有子项都是私有的。您可以定义新的公共函数来更改子项中的这些成员。

答案 2 :(得分:0)

使用friend 使派生类成为Base的朋友

class derive;//forward declaration
class Base
{
int i;

private:
  void set(int data){
      i = data;
  }
protected:
  int get(){
      return i;
  }
public:
  friend class derive;
};

class derive : public Base{
public:
    void change(int x){
        set(x);
        cout<<get()<<endl;
    }
};

您应该了解公共/受保护的继承。 class a : public/protected b

不要使用访问说明符重载/覆盖:

现在我将展示如何重新声明继承成员的访问说明符:

class derive : public Base{
public:
    Base::set;//this is valid redeclaration within public scope. Now anybody could use derive::set(x)
    void change(int x){
        set(x);
        cout<<get()<<endl;
    }
}