隐藏虚拟函数,定义明确吗?

问题描述 投票:1回答:1

请考虑以下代码:

#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()

但是,如果我用这个替换ab

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里),但实际上是在顶层带来一些东西类取消隐藏隐藏在中间父级中的(虚拟)函数。

c++ language-lawyer
1个回答
0
投票

使用声明将基类的成员引入派生类定义中,例如将受保护的基类成员公开为派生的公共成员。但是在这种情况下,您要在私有下声明using a::f;。因此,c类会将其派生为私有,这将使其无法访问。

© www.soinside.com 2019 - 2024. All rights reserved.