2012-12-30 22 views
2

我收到了要使用其頭的第三方庫。現在這個圖書館有一個班級'基地'。這個類的問題是它沒有虛擬析構函數。現在因爲我沒有和我一起的第三方代碼,我不能在那裏做改變。在第三方軟件中導出沒有虛擬析構函數的類

我被告知用這個編寫幾個派生類,並確保在刪除對象時正確清理對象。我們怎樣才能做到這一點?


感謝您的回覆,看起來像我只有2個選項。

1)把虛擬析構函數放在派生類中 2)使用合成。

我打算採取辦法沒有1.我打算有虛擬析構函數的包裝派生類。然後使用這個包裝派生類來進一步推導。以下是代碼。

//++ THIRD PARTY HEADER 
class base 
{ 
public: 
    ~base(){ } 
}; 
//-- THIRD PARTY HEADER 



//++ MY CODE 
// wrapper polymorphic base. 
class polymorphic_base 
{ 
public:  
    virtual ~polymorphic_base() { } 
}; 

class derived1 : polymorphic_base 
{ 
/// derived 1 
}; 

class derived2 : polymorphic_base 
{ 
/// derived 2 
} 


void foo(polymorphic_base *pb) 
{ 
    // use pb 
    // use pb 
    delete pb; 
} 


//-- MY CODE 

請讓我知道,如果這種方法應該罰款?

+0

通常,你運氣不好:如果他們沒有虛擬析構函數,通常意味着庫的作者不希望你從他們的類中派生出來。無論如何,爲什麼你需要派生(比如說,包括一個實例作爲數據成員?) – dasblinkenlight

+0

只需檢查:你是否證實'Base'本身並不是可能派生自某個超級基礎,它具有析構函數定義爲虛擬? – jogojapan

+1

誰刪除實例? – Yakk

回答

2

如果派生類的析構函數是public並且是非虛擬的,那麼它意味着第三方的實現者不希望他們的類用於多態繼承。

如果您的實現計劃有一個刪除基類指針所指向的派生類對象的場景,那麼不具有virtual析構函數的基類將導致未定義行爲。
如果你的實施計劃沒有上面提到的情景,那麼你仍然可以從課堂中得到沒有任何問題。

在第一種情況下,由於您沒有這個基類的代碼,所以無法克服崩潰。最好你可以做的是考慮一個has-a關係,而不是is-a關係,並嘗試讓它爲你工作。

0

隨着Base析構函數非虛擬,如果你必須支持deleteBase*那麼你只是運氣不好。

否則,

「確保對象得到妥善清理時,對象是刪除」

只需添加一個虛擬析構函數派生類Derived

但是你確定要求是真的,從字面上看,「當對象被刪除」?因爲更好的方法是禁止動態分配。你可以通過在代碼中實現幾乎不可用的東西,例如分配函數(例如,限制其可訪問性),以及通過在文檔中聲明動態分配不是支持的。

如果你能弄清楚從Base派生類的目的是什麼,那麼可能會有更好的解決方案。也許你不需要階級派生。比方說,你可以用Base成員來做。

相關問題