请考虑以下代码:
#include <iostream>
struct a {
virtual void f() = 0;
};
struct b: a {
private:
void f() override {
std::cout << "b::f()\n";
}
};
struct c: b {
public:
using a::f;
};
int main() {
::c c;
c.f();
}
这将与g ++和clang一起编译并按预期工作,即打印b::f()
。
但是,如果我用这个替换a
和b
:
struct a {
void f() { }
};
struct b: a {
private:
using a::f;
};
...代码不再编译。我收到以下错误(在using a::f;
中的c
行上):
错误:在此上下文中无法访问“
void a::f()
”
在这些情况下,我无法在标准中找到有关using a::f;
(在c
中的行为)的明确要点,因此上述标准是否已明确定义?
注意:我不是在谈论在类的public
范围内带来什么(例如,如果using b::f
受保护的话,在c
中的b::f
里),但实际上是在顶层带来一些东西类取消隐藏隐藏在中间父级中的(虚拟)函数。
使用声明将基类的成员引入派生类定义中,例如将受保护的基类成员公开为派生的公共成员。但是在这种情况下,您要在私有下声明using a::f;
。因此,c类会将其派生为私有,这将使其无法访问。