我遇到了c ++问题。我有一个基类,在类的私有可见性区域内有一个自引用对象指针。我在基类中有一个构造函数,用于初始化这两个指针。现在我有了我的派生类,其访问说明符是私有的(我想让我的基类私有的公共成员函数)。现在通过我的派生类的成员函数,我想创建一个对象指针,它可以指向基类的私有数据,即那些自引用对象指针。我的代码是:
class base{
private:
base *ptr1;
int data;
public:
base(){}
base(int d) { data=d }
};
class derived:private base{
public:
void member()
};
void derived::member()
{
base *temp=new base(val); //val is some integer
temp->ptr1=NULL; //I can't make this happen. To do this I had to declare all the
//private members of the base class public.
}
答案 0 :(得分:12)
派生类无法访问其基类的私有成员。没有任何类型的继承允许访问私有成员。
但是,如果您使用friend
声明,则可以这样做。
答案 1 :(得分:6)
除了友谊之外,没有其他方法可以访问其他类的私有数据。但是,继承可以做的是访问基类的受保护数据。但这并不意味着您可以访问基类型的另一个对象的受保护数据。您只能访问派生类的基础部分的受保护数据:
class base{
protected: //protected instead of private
base *ptr1;
int data;
public:
base(){}
base(int d) { data=d; }
};
class derived:private base{
public:
void member();
};
void derived::member()
{
base *temp=new base(3);
//temp->ptr1 = 0; //you need friendship to access ptr1 in temp
this->ptr1 = 0; // but you can access base::ptr1 while it is protected
}
int main(){}
答案 2 :(得分:2)
尝试将protected作为基类中的访问说明符并在私有模式下继承基类.....但是为了进一步使用基类的成员函数,可能需要很少的内联函数,因为它们也将被转换为私人
答案 3 :(得分:0)
好吧,我想,您正在尝试实现这样的结果!这不会报告任何编译器错误等。祝你好运!
class base{
private:
base *ptr1;
int data;
public:
base(){}
base(int d) { data=d; }
base* getPtr(); //getter to get access to base pointer
void setPtr(base* val); // setter to set value of the pointer variable
};
base* base::getPtr()
{
return ptr1;
}
void base::setPtr(base* val)
{
ptr1 = val;
}
class derived:private base{
private:
base* getPtr();
void setPtr(base* val);
public:
void member();
};
base* derived::getPtr()
{
return base::getPtr(); //derived version just invokes the base class version
}
void derived::setPtr(base* val)
{
base::setPtr(val); //derived version just invokes the base class version
}
void derived::member()
{
base *temp=new base(5); //put in a random number here instead of val
temp -> setPtr(nullptr);
}
答案 4 :(得分:-1)
我不同意其他一些答案,声称访问私人会员的唯一方法是将其设为friend
。
您可以通过内存中的地址直接访问私有成员。如果你对它感到满意的话。你可以在基类中有一个函数,它返回私有成员的地址,然后在派生类中使用一些包装函数来检索,取消引用和设置私有成员。