2009-10-24 67 views
0

我有一個從CMemFile派生的名爲TempMemFile的類。我需要但不能覆蓋TempMemFile中的Growfile方法。無法覆蓋CMemFile :: GrowFile

當我手工在我的派生類(TempMemFile)中編寫GrowFile方法時,它永遠不會被調用,並且在類視圖中單擊我的TempMemFile> Properties> Overrides Growfile時,其他方法不在此處列出。事實上,只有3種方法被列爲可重寫Assert,Dump & Serialize。 MSDN明確指出,此方法可以被覆蓋。我錯過了什麼嗎?

實施/宣言

// TempMemFile.h 

class CTempMemFile : public CMemFile 

    { 

    public: 
     CTempMemFile(void); 
     ~CTempMemFile(void); 
     DWORD Begin(void); 

    private:  
     void GrowFile(SIZE_T dwNewLen); // override 

    }; 

// TempMemFile.cpp 

CTempMemFile::CTempMemFile(void) : CMemFile 

    { 

    } 

CTempMemFile::~TempMemFile(void) 
    { 

    } 


void GrowFile(SIZE_T dwNewLen) 

{ 

// This function is never called but CMemFile::Growfile always is verified on the callstack 

} 
+0

你的聲明和調用是什麼樣的? – 2009-10-24 19:18:11

+0

// TempMemFile.h 類CTempMemFile:公共CMemFile { 公共: CTempMemFile(無效); 〜CTempMemFile(void); DWORD Begin(void); private: void GrowFile(SIZE_T dwNewLen); //覆蓋 }; // TempMemFile.cpp CTempMemFile :: CTempMemFile(無效):CMemFile { } CTempMemFile ::〜TempMemFile(無效) { } 空隙GrowFile(SIZE_T dwNewLen) { //此函數永遠不會被調用,但CMemFile :: Growfile始終在調用堆棧上驗證 } – Canacourse 2009-10-24 20:29:41

+0

我已經更新了原來的Q與您所要求的信息。 – Canacourse 2009-10-24 20:32:18

回答

1

GrowFile實施是一個名爲GrowFile全局函數。您需要在執行前提供CTempMemFile::

void CTempMemFile::GrowFile(SITE_T dwNewLen) 
{ 
} 
+0

做到了。仍然完全相同。 – Canacourse 2009-10-25 19:46:10

1

另外,還要確保您的覆蓋方法的可見性基類的聲明相符:

private:  
    void GrowFile(SIZE_T dwNewLen); // override 

是不正確

應該是publicprotected(無論CMemFile::GrowFile它宣佈爲) 。

+0

做到了。仍然完全相同。 – Canacourse 2009-10-25 19:45:33

+0

我看了一眼CMemFile,並且GrowFile受保護。這意味着它由基類調用而不是由消費者調用。你知道基類在什麼情況下需要調用GrowFile,你確定你正在造成這種情況嗎?它可能就是這種ptoected方法永遠不會被調用。 – dkackman 2009-10-25 20:06:30