MST

星途 面试题库

面试题:C++ 中友元关系在类继承体系中的作用范围

假设有类A,类B继承自类A,在类A中定义了一个友元函数friend_func。请阐述这个友元函数能否访问类B的私有成员,并说明原因。如果要让这个友元函数能够访问类B的私有成员,应该如何修改代码?
35.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 友元函数friend_func能否访问类B的私有成员及原因
    • 友元函数friend_func不能直接访问类B的私有成员。
    • 原因是友元关系不能被继承。当在类A中定义friend_func为友元函数时,friend_func只获得了访问类A私有成员的权限,并没有自动获得访问类A派生类(如类B)私有成员的权限。
  2. 让友元函数能够访问类B私有成员的修改方法: 在类B中重新声明friend_func为类B的友元函数,示例代码如下:
class A {
    friend void friend_func(A& a);
private:
    int a_private;
};

class B : public A {
    friend void friend_func(B& b);
private:
    int b_private;
};

void friend_func(A& a) {
    // 这里可以访问A的私有成员a_private
}

void friend_func(B& b) {
    // 这里可以访问B的私有成员b_private
    // 也可以访问从A继承过来的私有成员(通过一些方式,如借助基类接口等,这里暂不展开复杂情况)
}

这样,通过在类B中再次声明friend_func为友元函数,friend_func就获得了访问类B私有成员的权限。