2013-03-13 228 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的成員。這種混亂會降低可讀性。

相關問題