2011-06-11 48 views
4

在C++中實現純虛函數時,是否有一個最佳實踐指南,指出實現也應該是虛擬的?基本原理是什麼?虛擬化的實現也是虛擬的嗎?

class Interface 
{ 
    public: 
    virtual void foobar() = 0; 
}; 

class Concrete 
    : public Interface 
{ 
    public: 
    virtual void foobar(); 
}; 

回答

13

沒關係。

void foobar()Concretevirtual,無論您聲明它本身和它覆蓋在Interfacevoid foobar()

+4

我不知道虛擬功能總是保持虛擬。我今天學到了一些關於C++的知識。 :D – 2011-06-11 21:50:17

+0

不知道。我以爲你必須告訴它保持虛擬。真是遺憾,如果知道他有一個'Concrete'對象,它可以從虛函數調用中保存編譯器。 – 2011-06-12 00:21:44

+0

如果您通過接口指針調用foobar(),則編譯器將被迫進行虛擬函數調用,因爲它無法知道對象的實際類型。但是,如果直接對具體對象調用foobar(),編譯器可以自由地直接調用函數而不是通過vtable。 – Ferruccio 2011-06-12 13:26:54

7

雖然如果virtual關鍵字出現在派生類與否沒關係,我發現它是一個不可或缺的節省時間的自我記錄的做法總是包括它,讓任何人工作用你的代碼從現在開始兩年後立刻就能看到,班上的內容比立即見到的內容更多。

+0

我相信這實際上是您可以[可選]告訴編譯器在C++ 11中強制執行的規則之一,因此如果您忘記代碼將無法編譯。 – 2011-06-11 22:38:20

+0

@Dennis:我猜你在考慮**明確的虛擬函數覆蓋**:http://en.wikipedia.org/wiki/C%2B%2B0x#Explicit_virtual_function_overrides – 2011-06-11 22:51:44