"虚拟无效IBase :: Foo"和"虚拟空虚Foo"?

时间:2013-03-13 18:31:05

标签: c++ visual-c++

我使用了VisualAssistX Implement Virtual Methods选项并生成了:

class Base: public IBase
{
public:
    Base(void);
    ~Base(void);
    virtual void IBase::Foo();

我注意到我可以省略IBase并且程序仍然可以编译:

    virtual void Foo();

如果这是相同的代码?为什么VisualAssistX会插入IBase::?是否只是提高可读性的“代码风格”?

由于

3 个答案:

答案 0 :(得分:2)

如果您要从具有冲突虚函数的多个基类派生,这将有助于解决歧义。我怀疑这就是VisualAssistX选择插入IBase::的原因。

IBase::是否有助于提高可读性是值得商榷的。我个人觉得它让人分心。

此外,语法甚至不是标准的C ++。有关如何使用标准的可移植C ++解决多重继承问题的建议,请参阅Distinct implementations for pure virtual functions with same name

答案 1 :(得分:1)

绝对不会提高可读性,反之亦然。范围前缀用于从外部使用,或者当存在解决方案歧义时,使用范围内的前缀本身只是混淆代码并且实际上与OOP原则相矛盾。在内部范围内,您的实体不需要再次指示它,它完全是多余的。关于VA我只能推测它更容易实现。

答案 2 :(得分:1)

区别在于第一个不是有效的C ++。

也许您的编译器接受它(因为该编译器对该语言有许多奇怪的“扩展”);但如果您需要将代码移植到更多标准编译器,那么您将需要使用第二种形式。

  

为什么VisualAssistX会插入IBase::

我猜这是一个错误的尝试,表明该函数会覆盖IBase中声明的函数;但我不知道为什么有人认为这可能是一个好主意。

  

提高可读性是否只是“代码风格”?

恰恰相反;这个虚假声明使该函数看起来像IBase的成员,当它实际上是Base的成员时。这种混乱会降低可读性。