c++ - using 声明是否应该隐藏继承的虚函数?

标签 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;
}

上面的代码使用 gcc 给出了

level2
level1

但在icc中给出

 level2
 level2

哪个是正确的还是标准未定义?

编辑: 这证明肯定存在错误,考虑以下主要功能

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;
}

所以同一个对象直接使用会产生不同的结果,而通过相同类型的指针使用会产生不同的结果!!!

最佳答案

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

这是一个 known g++ bug .

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

关于c++ - using 声明是否应该隐藏继承的虚函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4669524/

相关文章:

c# - C# 中的继承 + 嵌套类

c - 为什么 'printf' 在 gcc 中不打印任何内容?

c++ - -O3(优化级别 3)有什么问题?

c++ - 在 C++ 中使用 Windows Composition 引擎的透明窗口

c++ - 冲突的不匹配标签与标准库一起编译,但不以其他方式编译

c++ - 如何更改 Boost.Serialization 中的默认枚举序列化

c++ - 如何在 gcc 中使用 Intel 的数学函数库?

c++ - 在 Windows 服务器上使用卡萨布兰卡

c++ - 什么时候在 OOP 中使用友元是谨慎的?

python - super(cls, instance) 和 super(cls, subclass) 有什么区别?