如何使派生类访问私有成员数据

How to make a derived class access the private member data?

本文关键字:成员 数据 访问 何使 派生      更新时间:2023-10-16

我遇到了一个 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. 
}

派生类无法访问其基类的私有成员。 任何类型的继承都不允许访问私有成员。

但是,如果您使用friend声明,则可以这样做。

没有

其他方法可以访问其他班级的私人数据,然后友谊。但是,对于继承,您可以做的是访问基类的受保护数据。但这并不意味着您可以访问基类型的另一个对象的受保护数据。只能访问派生类的基部分的受保护数据:

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

尝试在基类中将保护作为访问说明符,并在私有模式下继承基类.....但是为了进一步使用基类 U 的成员函数,可能需要一些短的内联函数,因为它们也将转换为 private

好吧,我认为,您正在尝试实现这样的结果!!这不会报告任何编译器错误等。祝你好运!!!

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

我不同意其他一些答案,声称访问私有成员的唯一方法是使其成为friend

您可以通过私有成员在内存中的地址直接访问该成员。如果你对它感到满意,那就是。可以在基类中有一个返回私有成员地址的函数,然后在派生类中使用一些包装函数来检索、取消引用和设置私有成员。