MST

星途 面试题库

面试题:C++ 友元类的继承及访问特性

假设存在类 A 和类 B,类 B 是类 A 的友元类。当类 C 继承自类 A,类 D 继承自类 B 时,分析类 D 对类 C 的成员访问权限情况,并说明原因。同时,编写相关代码进行验证。
25.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 访问权限分析
    • 类 B 是类 A 的友元类,这意味着类 B 可以访问类 A 的私有和保护成员。
    • 然而,友元关系是不继承的。当类 C 继承自类 A,类 D 继承自类 B 时,类 D 并不会自动成为类 C 的友元。所以,类 D 对类 C 的私有和保护成员没有特殊的访问权限,只能访问类 C 的公有成员。
  2. 代码验证
#include <iostream>

class A {
private:
    int privateA;
protected:
    int protectedA;
public:
    A() : privateA(10), protectedA(20) {}
};

class B : public A {
    friend class B;
public:
    void accessA(A& a) {
        // 类 B 可以访问类 A 的私有和保护成员,因为 B 是 A 的友元
        std::cout << "In B, privateA of A: " << a.privateA << std::endl;
        std::cout << "In B, protectedA of A: " << a.protectedA << std::endl;
    }
};

class C : public A {
private:
    int privateC;
protected:
    int protectedC;
public:
    C() : privateC(30), protectedC(40) {}
};

class D : public B {
public:
    void accessC(C& c) {
        // 类 D 不能访问类 C 的私有和保护成员
        // std::cout << "In D, privateC of C: " << c.privateC << std::endl;  // 这行代码会报错
        // std::cout << "In D, protectedC of C: " << c.protectedC << std::endl;  // 这行代码会报错
        // 只能访问类 C 的公有成员(这里没有定义,所以示例代码仅作说明)
    }
};

int main() {
    A a;
    B b;
    C c;
    D d;

    b.accessA(a);
    // d.accessC(c);  // 若取消注释,尝试访问私有或保护成员会报错

    return 0;
}

在上述代码中,通过实际的编译报错可以验证类 D 对类 C 的私有和保护成员没有访问权限,只能访问类 C 的公有成员(这里类 C 未定义公有成员,仅通过逻辑和注释说明)。