友元类对象可以在其成员函数中的派生类对象上访问基类私有成员吗?

时间:2018-03-20 22:21:11

标签: c++ class friend

如何在D d的朋友类中访问派生类Base B的对象?

由于DF之间没有关系,因此可能如何。{p> 访问朋友类中b_var对象的私有成员D

#include <iostream>
#include <string>
using namespace std;

class B {              //Base class
    int b_var;
    friend class F;
};

class D : public B {    //Derived Class
    int d_var;
};

class F {              //This class is a friend class of B
public:               //So it should access objects of B Not Derived Class 
    void func(D &d) {      // object LIke in example d    
        d.b_var = 5;
        cout << "I accessed D's Private Member b_var :" << d.b_var;
    }
};

int main()
{
    cout << "fine";
}

2 个答案:

答案 0 :(得分:1)

  

由于D和F之间没有关系,那么如何在朋友类中访问D对象的私有成员b_var?

F可以访问类B的基础D,因为它是公共基础。此外,F可以访问B的私人成员,包括b_var,因为FB的朋友。因此,F可以访问b_var,它是班级B的基础D的成员。

或许可视化可访问性以使用更合格的名称查找。 d.b_vard.B::b_var相同。

答案 1 :(得分:0)

这里发生的事情是,班级F是班级B的朋友,这意味着它可以完全访问其成员; private, protected, public

班级D是班级B的孩子,它继承了班级Aprivate成员的所有成员。因此,尝试访问私有基类成员将发出一个erorr,例如:

class D : public B{
    void func(){
        std::cout << b_var << std::endl; // error cannot access private members
    }
};

正如您所看到的,D源自B但无法访问b_var,因为它是private

如果您声明孩子是父母的朋友,您可以让它访问它:

class B{
    int b_var;
    friend class D;
};

class D : public B{
    public:
        void func(){
            cout << b_var; // ok now! because D is friend of its parent then it has access to its private data.
        }
}

在您的示例课程中,D是班级B的孩子,因此无法访问b_var,因为它是私有的。但是,课程F可以完全访问课程B,因此可以访问其private, public, protected成员:

class B{
    int b_var = 10;
    friend class F;
};

class D : public B{
    int d_var;
};

class F{
    public:
        void func(D d){
            cout << d.b_var; // it is a hack to encapsulation here

            B b;
            cout << b.b_var << endl; // ok here because F is friend of B.
        }
};

正如您在上面所看到的,F具有对B的完全访问权限,它使用D对象并授予它此权限。通常,D无法访问B个私有数据,但F会授予对其的访问权限。

  • 友谊不是传递性的(朋友的朋友不是你的朋友)
  • 友谊不是继承的(你朋友的孩子不是你的朋友)
  • 友谊不是可交换的(作为我,你的朋友并不代表你是我的朋友)。