2014-10-28 64 views
2

讓我的parent班是;兒童班的虛擬和非虛擬功能的區別

class parent { 
    virtual void printx() { cout<< "parent" ; } 
} 

案例1:

class child : public parent { 
    virtual void printx() { cout<< " child" ; } 
} 

案例2:

class child : public parent { 
    void printx() { cout<< " child" ; } 
} 

有什麼區別,如果我在child類功能printx的情況下,2省略virtual

回答

5

如果函數簽名相同,則child類不需要將virtual添加到方法中,編譯器會爲您處理此問題。 如果函數在父類中被聲明爲虛擬的,那麼子類的重寫方法也是虛擬的。

如果C++ 11可用,請考慮將override specifier添加到子類中的重寫方法;

class child : public parent { 
    void printx() override { cout<< " child" ; } 
} 

隨着override,編譯器會檢查,以確保該方法確實重寫基類中的虛方法。如果沒有,編譯器會爲你生成一個錯誤。例如;如在原始發佈中那樣,它將拾取printxpritnx之間的拼寫差異。

+3

+1重要的是......這會引起人們注意'printx'和'pritnx'不同...... – 2014-10-28 08:00:43

3

兩者都是相同的。如果一個函數在基類中被聲明爲虛擬的,那麼無論你是否明確提及它,它在所有派生類中都是虛擬的。