C++ 派生类的朋友可以访问哪些变量?

C++ 派生类的朋友可以访问哪些变量?,c++,class,friend,derived,C++,Class,Friend,Derived,为了简化我的问题,我有这样的东西: class Base { private: protected: int a,b; string c; public: [some functions here] } class Derived : public Base{ [some variables and functions] friend void function(); } void function(){ int d[a][b]; [stuff

为了简化我的问题,我有这样的东西:

class Base {

private:

protected:
    int a,b;
    string c;

public:
    [some functions here]

}

class Derived : public Base{

    [some variables and functions]

friend void function();

}

void function(){

int d[a][b];
[stuff]

}
class Derived : public Base{

    [some variables and functions]

    friend void function(Derived& derived);
};

void function(Derived& derived)
{
     int a = derived.get_a();
     int b = derived.get_b();
     // I don't know but even the following might work
     int c = derived.a; // able to access field of friend's base class.
}

void test()
{
    Derived* derived = new Derived();
    function(*derived);
    delete derived;
}

基本上,我的void函数需要访问基类的受保护类中的内容。我想在protected部分中定义这些变量。对于必须与派生类建立友好关系的函数,是否还有其他方法可以访问a和b?

您可以在
派生中定义私有方法:派生中的任何方法都可以访问受保护的Base成员

函数是派生的朋友,因此它可以调用派生中的那些私有方法,这些私有方法反过来访问受保护的Base成员


编辑以回复下面的评论

get_a()
成员方法和
a
成员数据是它们类的成员。这些成员的实例存在于其类的实例中。它们只存在于实例中,所以要访问它们,需要通过类的实例访问它们

例如,类似这样的内容:

class Base {

private:

protected:
    int a,b;
    string c;

public:
    [some functions here]

}

class Derived : public Base{

    [some variables and functions]

friend void function();

}

void function(){

int d[a][b];
[stuff]

}
class Derived : public Base{

    [some variables and functions]

    friend void function(Derived& derived);
};

void function(Derived& derived)
{
     int a = derived.get_a();
     int b = derived.get_b();
     // I don't know but even the following might work
     int c = derived.a; // able to access field of friend's base class.
}

void test()
{
    Derived* derived = new Derived();
    function(*derived);
    delete derived;
}

您的函数需要通过如下派生的类的实例访问a和b

void function()
{
Derived objectDerived;
int d[objectDerived.a][objectDerived.b];
[stuff]
}

这应该很好;当你尝试它时会发生什么?它告诉我a和b没有在scopehmm中声明,你是说“friend void function();”行应该在派生类的“Private:”下吗?嗯,所以我在派生类的Private部分写了两个函数:“class-Derived:public-Base{Private:int-get_a(){return a;}int get_b(){return b;]public:friend void function();}void function(){int a=get_a();int b=get_b();}但这仍然告诉我get_a和get_b不在范围内。有什么问题吗?