2015-01-09 40 views
0

我有下面的代碼有問題:C++:在亞 - 亞覆蓋keywoard

#include <iostream> 

using namespace std; 

class C1 { 
    public: 
    void f() { cout << "something" <<endl; } 
}; 

class C2 : public C1 { 
    // void f() { cout << "something more " << endl;} // no f implementation here 
}; 

class C3 : public C2 { 
public: 
    void f() { cout << "something else" <<endl; } 

}; 

int main() { 
    C1 c1; 
    C3 c3; 
    c1.f();  // outputs "something" 
    c3.f();  // outputs "something else" 
    return 0; 
} 

這工作得很好。但如果我標記C3::f()override它不會編譯(example on ideone)。有誰知道爲什麼發生這種情況?顯然我在這裏成功覆蓋函數f!我誤解了關鍵字override的想法嗎?

+2

您只能覆蓋虛擬功能。這是你打算使用,但只是簡單地忘記。 –

回答

0

在C++中,成員函數默認情況下不是虛擬的,它們必須是虛擬的,以便在子類中爲它們(帶或不帶關鍵字)override。所以,你的原始類需要是:

class C1 { 
    public: 
    virtual void f() { cout << "something" <<endl; } 
}; 

否則你只是隱藏它。

此外,覆蓋是相當新 - 確保您使用正確的選項來調用c + + 11。

+0

謝謝,我甚至沒有意識到重寫和隱藏之間的區別。 – Dotur

0

覆蓋只是一個安全網。它告訴編譯器這個方法必須存在於基類中,並且必須被定義爲虛擬的,以便它可以被重寫。如果任何這些要求不符合,它將導致編譯錯誤。什麼讓你重寫一個方法只是它已被定義爲基類中的虛擬的事實。

0

是的,覆蓋關鍵字/說明符只能用於覆蓋虛擬功能。文檔here

+0

還沒有見過@Etienne Maheu的回答 –