我是那些必须让他们的代码以 0 个警告编译的人之一。通常我尊重编译器,如果它向我发出警告,我认为它是我应该稍微修改我的代码的标志。如果我必须告诉编译器忽略给定的警告,我会抽搐一下。
但是这个我似乎无法解决,据我所知,我没有做任何“坏”的事情。有人认为这是一个糟糕的设计吗?我看不出它有什么特别令人讨厌的地方(“邪恶的钻石”除外),但它是完全有效且有用的代码。但它会生成(在 MSVC 中)2 级警告!
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'
现在我认识到我可以用编译指示关闭这个警告,但这不是我想在这里问的问题。有什么理由我应该在这里听编译器,还是这只是一个非常过分热心的警告?