我使用了VisualAssistX Implement Virtual Methods
选项并生成了:
class Base: public IBase
{
public:
Base(void);
~Base(void);
virtual void IBase::Foo();
我注意到我可以省略IBase
并且程序仍然可以编译:
virtual void Foo();
如果这是相同的代码?为什么VisualAssistX会插入IBase::
?是否只是提高可读性的“代码风格”?
由于
答案 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
的成员时。这种混乱会降低可读性。