【发布时间】:2011-06-07 20:36:20
【问题描述】:
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
哪个是正确的还是没有标准定义?
编辑: 这证明肯定有bug,考虑下面的main函数
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;
}
所以同一个对象直接使用会产生不同的结果,通过相同类型的指针使用会产生不同的结果!!!
【问题讨论】:
-
我猜 GCC 是正确的,但我不确定。
-
我已确认 TDM MinGW g++ 4.4.1 的行为。这是一个 g++ 错误,请报告它。干杯&hth.,
-
有趣的是,我昨天刚研究过这个。
-
这已在 GCC 4.8 中修复。
标签: c++ inheritance gcc icc using-declaration