MSVC为什么在没有任何错误或警告的情况下构建它?这段代码中有些含糊吗?GCC编译器返回错误,因为该函数f
是私有的。
#include <stdio.h>
class A {
private:
bool f(void) {return true;};
};
class B : public A {
};
class C : public B {
public:
using A::f;
};
int main() {
C c;
if (c.f()) {
printf("Access to private function\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
例如,请看这里:https : //godbolt.org/z/I5mUSa
这是一个 MSVC 错误。[命名空间.udecl]/18:
在未命名构造函数的 using 声明符中,引入的声明集的所有成员都应可访问。在命名构造函数的 using 声明符中,不执行访问检查。特别是,如果派生类使用 using 声明符来访问基类的成员,则该成员名称应该是可访问的。如果名称是重载成员函数的名称,则所有指定的函数都应可访问。using 声明符提到的基类成员应在指定 using 声明符的类的至少一个直接基类的范围内可见。
由于A::f
中 不可访问C
,因此该程序格式错误(位于using A::f
),因此编译器应拒绝它。