应用声明是否应该隐藏继承的虚函数?

bal*_*lki 7 c++ inheritance gcc icc using-declaration

struct level0
{
  virtual void foo() = 0;
};

struct level1 : level0
{
  virtual void foo() { cout <<" level1  " << endl; }
};

struct level2 : level1
{
  virtual void foo() { cout <<" level2 " << endl; }
};

struct level3 : level2
{
  using level1::foo;
};

int main()
{
  level1* l1 = new level3;
  l1->foo();
  level3 l3;
  l3.foo();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码使用gcc给出

level2
level1
Run Code Online (Sandbox Code Playgroud)

但在icc给出

 level2
 level2
Run Code Online (Sandbox Code Playgroud)

哪一个是正确的还是标准不确定?

编辑:这证明确实存在错误,请考虑以下主要功能

int main()
{
    level3 l3;
    l3.foo();               // This prints level1

    level3* pl3 = &l3;
    pl3->foo();             // This prints level2

    level3& rl3 = l3;
    rl3.foo();              // This prints level1

    level3& rpl3 = *pl3;
    rpl3.foo();             // This prints level2

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

因此,直接使用时相同的对象会产生不同的结果,并且当通过相同类型的指针使用时会产生不同的结果!

asc*_*ler 5

标准部分10.3p2中的示例清楚地表明使用声明不会覆盖虚函数.

这是一个已知的g ++错误.

正如您所注意到的,当通过引用或指针调用成员函数时,而不是已知动态类型的情况,该错误不会发生.