2012-12-22 27 views
1

我有一個抽象類,我從繼承。爲了說清楚 - 我在繼承者中實現了所有的抽象方法。不能從繼承類調用析構函數

在完成使用由繼承者類構造的對象之後,即時試圖破壞它,但不是調用繼承的析構函數,而是將它發送給抽象方法。

我PROGRAMM

它看起來像這樣

class LinkedHash { 

private: 
     LinkedHashEntry **table; 
     int max_size; 
public: 
     /* Creates a hashtable of size maxSize*/ 
     LinkedHash(int); 
     LinkedHash(){}  
     /* deletes all members of the hashtable */ 
     virtual ~LinkedHash(); 

     virtual int hashFunction(int key) = 0; 

     void insert(int key, Process* value); 

     void remove(int key); 
     int getMaxSize(){return max_size;} 
     LinkedHashEntry* search(int x); 
}; 

class LinkedHashinheritor: public LinkedHash { 

    public: 
     LinkedHashinheritor():LinkedHash(1000){} 
     int hashFunction(int key); 
}; 

這是我的cpp文件的相關代碼:

int LinkedHashinheritor::hashFunction(int key) 
{ 
    return key%1000; 
} 

,並有用於構造函數和析構函數相關的對象調用:

Scheduler::Scheduler() 
{tmp_lh=new LinkedHashinheritor();} 

Scheduler::~Scheduler() 
{ 
    delete tmp_lh; 
} 
+2

有你提供了一個實現你的你有沒有爲你的派生類提供析構函數? – SomeWittyUsername

+0

你是否嘗試過對項目進行完全重建?有時候,如果頭文件發生變化(例如,通過向類中添加新的虛擬方法)和源文件包括那個頭文件沒有得到重新編譯 –

+0

是的,當然 - 我的基本析構函數是實現的,我甚至沒有爲我的派生類聲明desructor,它應該由編譯器自動調用,不是嗎? –

回答

3

爲了使這個清晰前瞻:做一個抽象類不是防止它的驅逐者被調用。 的所有的析構函數將繼承層次結構中的類總是調用(按從派生類到基類的順序)。因爲你還沒有在你的派生類中聲明析構函數,而且編譯器提供的析構函數非常微不足道(因爲它只需從基類中調用析構函數),編譯器很可能已經優化了派生的析構函數。

2

請注意,virtual析構函數是特殊的virtual函數:在銷燬派生對象時總是調用基類析構函數。使析構函數virtual的效果是,你可以通過指針爲基本類型delete派生類型的對象(如果你做到這一點沒有析構函數是virtual你得到了一個未定義的行爲。