【发布时间】:2023-03-03 02:16:01
【问题描述】:
这是我在 source.cpp 文件中的代码:
class B
{
friend class F;
protected:
int protectedIntB;
};
class D : public B {};
class F
{
public:
int f(D &d) {return ++d.protectedIntB;}
};
当我用g++ -c -Wall -pedantic -std=c++11 source.cpp 和cl /c source.cpp 编译上面的代码时,两个编译器都编译成功。但是,当我使用 protected 而不是 public 从 B 继承 D 时:
class D : protected B {};
这一次,gcc 编译成功,而 cl 报错说 B::protectedIntB is inaccessible in return ++d.protectedIntB;.
另一种情况是用private替换public:
class D : private B {};
这一次,两个编译器都会产生错误。顺便说一句,我使用的是由 mingw-w64 构建的 gcc 版本 5.3.0 和 VS2015 的 cl 版本 19.00.24210。
我的问题来了:
基类的友元类如何通过基类派生类的对象访问该基类的成员,为什么gcc和cl处理方式不同?
编辑:
感谢songyuanyao 和Brian,在protected 的情况下,这似乎是gcc 5.3.0 中的一个错误。只有public的情况应该编译成功,gcc 6.1.0也可以正常工作。
【问题讨论】:
标签: c++ inheritance language-lawyer friend