9

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

5 回答 5

14

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

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

于 2013-09-22T13:40:33.883 回答
11

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

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(){}
于 2013-09-22T14:48:24.560 回答
2

尝试将protected作为基类中的访问说明符并以私有模式继承基类.....但是为了进一步使用基类的成员函数,您可能需要很少的短内联函数,因为它们也将被转换为私有

于 2015-05-12T19:25:10.880 回答
1

嗯,我想,你试图达到这样的结果!这不会报告任何编译器错误等。祝你好运!!!

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);
}
于 2020-01-30T12:22:35.290 回答
-4

我不同意其他一些声称访问私有成员的唯一方法是将其设为friend.

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

于 2018-04-20T04:04:06.940 回答