C++友元类访问派生类对象基类私有成员相关技术问询
C++友元类与派生类的访问权限问题解答
咱们逐个拆解你提出的两个问题,结合给出的代码示例来聊清楚:
问题1:友元类的对象能否在其成员函数中访问派生类对象的基类私有成员?
结论是:可以,但有前提——只要这个友元类是基类的友元,它就能访问派生类对象中继承自基类的私有成员。
拿你的代码举例:类F是基类B的友元,派生类D公有继承了B。那么F的成员函数就可以通过D的对象,访问其中属于B的私有成员b_var。因为D的对象本质上包含一个B类型的子对象,而F作为B的友元,天生拥有访问B所有私有成员的权限。
问题2:基类B的友元类F如何访问派生类D的对象?由于D与F之间无直接关系,为何F能访问D对象的私有成员b_var?
先明确两个核心点:
F并不是D的友元,所以它绝对无权访问D自己定义的私有成员(比如代码里的d_var)。F能碰D对象里的b_var,本质是在访问D对象中继承自B的那部分子对象的私有成员。
友元关系是绑定到类本身的:F被声明为B的友元,意味着它可以访问任何B类型对象的私有成员——而D公有继承B后,每个D对象都自带一个完整的B子对象,这个子对象就等同于一个独立的B对象,所以F自然有权操作它的私有成员b_var。
咱们把你的代码补全,更直观地看效果:
#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: void fun(D& d) { // 合法:访问D对象中属于B的私有成员 d.b_var = 10; cout << "Access B's private member via D object: " << d.b_var << endl; // 非法:F不是D的友元,无法访问D自己的私有成员 // d.d_var = 20; } }; int main() { D d_obj; F f_obj; f_obj.fun(d_obj); return 0; }
这段代码里,F::fun可以正常修改d_obj的b_var,但如果尝试触碰d_var,编译器会直接报错——因为F没有访问D私有成员的权限。
内容的提问来源于stack exchange,提问作者raina




