2013-10-31 37 views
0

我如何覆蓋功能 如果我有重寫類中的函數

class C 
{ 
    public: 
    C(); 
}; 


class A: public C 
{ 
    public: 
    virtual string write()=0; 
}; 

困惑,我再拍類

class B: public A 
{ 
    public: 
     string B :: write() override {} 
}; 

這是不適用於B類繼承類虛擬方法並覆蓋它?

ok在main中,我不允許調用這個抽象類的構造函數是否正確?但是如果這個抽象類具有它繼承的構造函數,我怎樣稱它們呢?

void main() 
{ 
    B(); 
} 
+0

您在B類定義中有語法錯誤 –

+0

是的,我打算放「公共A」,並且我錯誤地放了「A類」,但該語法錯誤不在我的代碼中,謝謝 –

+0

我認爲你只需要刪除'B ::'限定符 –

回答

0

語法從另一個類繼承,應該是這樣的:

class B: public A{ 
    public: 
     virtual string write(){ 
     //do something 
     return someString; 
     } 
}; 
+0

但如何重寫該方法,以便繼承的類不是抽象的? –

+0

@ user2521432那裏!看到編輯 –

+0

好,所以在主,我不能調用這個抽象類的構造函數正確嗎?但是如果這個抽象類具有它繼承的構造函數,我怎樣稱它們呢? –

0

如果要指定override(提供C++ 11)在這裏,你可以不喜歡它這個。

頭文件

class B : public A { 
public: 
    virtual string Write() override; 
} 

CPP文件

string B::Write() { 
// Your implementation here. 
} 

事實上,它是指定override時,那是你的真實意圖一個很好的做法。它避免了錯誤,例如試圖用string B::Write() const覆蓋string A::Write(),但得到了定義第二個函數的結果。在這種情況下,如果指定string B::Write() const override,這將是一個編譯錯誤。

0

這是無效的類B繼承類虛擬方法和重寫它?

您需要刪除冗餘(並且非法)B::並返回一些內容。否則就很好。

我不能爲這個抽象類的構造函數調用正確嗎?但是如果這個抽象類具有它繼承的構造函數,我怎樣稱它們呢?

你根本不能直接調用構造函數;這不是語言的工作原理。當你創建一個對象的構造函數間接調用:

B b; // Create an instance of B, indirectly calling B::B(), which calls A::A() 

由於A是抽象的,你不能創建該類型的對象;只有像B這樣的派生類型會覆蓋所有純虛函數。

+0

但是,如果派生類(B)是派生的從抽象類(A)抽象出來,而抽象類是從普通類(C)中派生出來的,那麼我怎麼在main中調用C中的構造函數,從B開始,因爲它應該從C繼承了構造函數吧? –

+0

@ user2521432:您不要調用構造函數。它在創建對象時會自動調用。 'B'有一個隱含的構造函數,它調用'A'的(隱式)構造函數,它調用'C'的構造函數。因此,創建一個'B'類型的對象將會正確地初始化它的'C'子對象及其構造函數。 –