根据下面的代码,如果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;
}
答案 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;
}
}