2013-03-13 216 views
5

我用VisualAssistX Implement Virtual Methods选择,它产生:“virtual void IBase :: Foo”和“virtual void Foo”之间的区别是什么?

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

我注意到,我可以省略IBase和程序仍编译这样的:

virtual void Foo(); 

如果这是相同的代码?为什么VisualAssistX插入IBase::?它仅仅是一种“代码风格”来提高可读性?

谢谢

+3

我认为在类声明中插入名称空间/类名*会降低可读性。裸函数名称很好。 – 2013-03-13 18:34:56

+3

这是甚至有效的C++? – NPE 2013-03-13 18:35:50

+0

@ RichardJ.RossIII:我不能使用'g ++ 4.7.2'来编译这个代码:'error:不能在'D''中声明成员函数'B1 :: foo' – NPE 2013-03-13 18:37:14

回答

2

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

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

此外,语法甚至不是标准的C++。有关讨论和建议,请参阅Distinct implementations for pure virtual functions with same name以了解如何使用标准的便携式C++解决多重继承问题。

+0

然而,它是MSVC-C++,它可能只与OP有关。 – 2013-03-13 18:44:40

1

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

1

区别在于第一个是无效的C++。可能你的编译器接受它(因为这个编译器有很多奇怪的“扩展”);但如果您需要将代码移植到更多标准编译器中,那么您将需要使用第二种形式。

Why VisualAssistX inserts IBase:: ?

我猜想,这是一个误导性的尝试,表明功能将覆盖IBase声明的一个;但我不知道为什么有人认为这可能是一个好主意。

Is it just kind of "code-style" to improve readability?

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

相关问题