关于这个错误有很多问题,所有的答案似乎都暗示向下转型是不可能的。只有this answer提到友元作为可能的解决方案,至少据我所知。但是,以下代码(为清楚起见删除了不相关的内容)无法编译:
class C;
class A {
friend class C; // this does not help
};
class B : protected A {
friend class C; // this does not help either
};
class C {
public:
void foo(A* a) {};
};
B b;
C c;
void bar()
{
c.foo(&b); // this produces error: class A is an inaccessible base of B
}
为什么友元对引用不起作用?毕竟,“C”完全有能力通过指向“B”的指针调用“A”的 protected 方法。
完整的错误是
prog.cc: In function 'void bar()':
prog.cc:20:13: error: 'A' is an inaccessible base of 'B'
20 | c.foo(&b);
最佳答案
你的代码等同于:
B b;
C c;
A * a = &b; // <- This cast produces the error
c.foo(a);
您不能将 &b
转换为 A*
,因为无论 C
的友元如何,基类都受到保护。
关于c++ - 尽管有友元,但无法访问基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56673706/