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

时间:2013-09-22 13:38:41

标签: c++

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

5 个答案:

答案 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

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