2011-08-17 95 views
4

虛擬限定符到派生類中的基類虛擬函數是否有區別?派生類中的虛擬限定符

class b 
{ 
    public: 
    virtual void foo(){} 
}; 

class d : public b 
{ 
    public: 
    void foo(){ .... } 
}; 

class d : public b 
{ 
    public: 
    virtual void foo(){ .... } 
}; 

有沒有在這兩個聲明的任何區別,除了它使d的孩子做意識到FOO的虛擬性()?

+0

afaik,如果其他東西從d類派生出來,它會有所作爲 –

+0

@Kshitij:不,即使那樣也沒有什麼區別。一旦「foo」是虛擬的,它永遠是虛擬的,無論你離開類層次結構的底層多遠。 – Nawaz

回答

2

沒有區別 - 這是一種虛擬覆蓋的方式。

這是一個風格問題,並已明確討論here

1

這是更好的風格,包括虛擬關鍵字。但這不是必需的。

5

它沒有區別。 foo在從b(及其後代)派生的所有類中都是虛擬的。

從C++ 03標準,§10.3.2:

如果虛擬成員函數VF在類Base和在派生的類聲明,直接或間接地從基地成員函數衍生vf具有與Base :: vf相同的名稱和相同的參數列表,因此Derived :: vf也是虛擬的(,不管它是否被聲明爲)並且它重寫Base :: vf。

1

沒有區別。

一旦foo虛擬,其虛擬永遠在類層次結構,無論你從類層次結構基本走多遠。

但我更喜歡寫virtual即使在overrridden功能,因爲它增加了可讀性的代碼,這是相當重要的。

+0

爲了更加安全,C++ 11添加了一些可以指定的覆蓋關鍵字,因此編譯器會檢查您在覆蓋虛函數時是否在簽名中犯了錯誤,並且意外超載了它 – PlasmaHH

相關問題