我是那种必须让代码在编译时不发生任何警告的人。通常情况下,我尊重编译器,如果它发出警告,我就会把它视为我需要稍微修改一下代码的信号。但是对于这个问题,我好像无法解决,而且据我所知,我没有做任何“坏事”。有人认为这是一种糟糕的设计吗?我看不出有什么特别糟糕的地方(除了“恶魔钻石”),但它是完全有效和有用的代码。但是它会在 MSVC 中生成二级警告!
class IFoo
{
public:
virtual void foo() = 0;
};
class Bar : public virtual IFoo
{
public:
virtual void foo() { std::cout << "Hello, world!"; }
};
class Baz : public virtual IFoo
{
};
class Quux : public Bar, public Baz
{
};
现在如果我创建一个Quux对象,它应该调用Bar::foo的实现。MSVC非常有帮助:它警告我不够模棱两可?
警告 C4250:“Quux”:通过支配继承了“Bar::Bar::foo”
现在我知道我可以使用#pragma关闭此警告,但这不是我在这里要问的问题。是否有理由我应该听从编译器的建议,或者这只是一个过度热心的警告?