如何在D d
的朋友类中访问派生类Base B
的对象?
由于D
和F
之间没有关系,因此可能如何。{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";
}
答案 0 :(得分:1)
由于D和F之间没有关系,那么如何在朋友类中访问D对象的私有成员b_var?
F
可以访问类B
的基础D
,因为它是公共基础。此外,F
可以访问B
的私人成员,包括b_var
,因为F
是B
的朋友。因此,F
可以访问b_var
,它是班级B
的基础D
的成员。
或许可视化可访问性以使用更合格的名称查找。 d.b_var
与d.B::b_var
相同。
答案 1 :(得分:0)
这里发生的事情是,班级F
是班级B
的朋友,这意味着它可以完全访问其成员; private, protected, public
。
班级D
是班级B
的孩子,它继承了班级A
但private
成员的所有成员。因此,尝试访问私有基类成员将发出一个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
会授予对其的访问权限。