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/