面试题答案
一键面试- 访问权限分析:
- 类 B 是类 A 的友元类,这意味着类 B 可以访问类 A 的私有和保护成员。
- 然而,友元关系是不继承的。当类 C 继承自类 A,类 D 继承自类 B 时,类 D 并不会自动成为类 C 的友元。所以,类 D 对类 C 的私有和保护成员没有特殊的访问权限,只能访问类 C 的公有成员。
- 代码验证:
#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 未定义公有成员,仅通过逻辑和注释说明)。