【发布时间】:2011-10-27 15:38:50
【问题描述】:
我是那些必须让他们的代码以 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'
现在我认识到我可以使用编译指示关闭此警告,但这不是我要在这里提出的问题。有什么理由我应该在这里听编译器,还是这只是一个非常过分热心的警告?
【问题讨论】:
-
老实说,在我看来,使用虚拟继承是糟糕的设计。它太复杂了,收益很少。在使用它之前,我会认真三思而后行。
-
代码可能还不错,但很脆弱。依靠晦涩的消歧规则来选择要调用的函数不会使代码非常易于阅读或维护。
-
@PeterAlexander "太复杂了" 怎么复杂?
标签: c++ visual-c++ diamond-problem