You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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_objb_var,但如果尝试触碰d_var,编译器会直接报错——因为F没有访问D私有成员的权限。


内容的提问来源于stack exchange,提问作者raina

火山引擎 最新活动