2008-12-15 75 views
3

我有一個抽象類在C++定義的純虛方法:如何使用抽象類將內存分配給實例數組?

class Base 
{ 
Base(); 
~Base(); 

virtual bool Test() = 0; 
}; 

我已經與一些其它類的,我將稱之爲(其爲試驗()提供一個實現)的子類此A,B,C,等等。我現在想用這個基類來創建這些類型的數組:

int main(int argc, char* argv[]) 
{ 
    int size = 0; 
    Base* bases = new Base[10]; 

    bases[size++] = new A(); 
    bases[size++] = new B(); 

    for (int i = 0; i < size; i++) 
    { 
     Base* base = bases[i]; 
     base->Test(); 
    } 
} 

(對不起,我可能會做任何錯誤,我在飛行寫這封信,提供一個簡單的例子)。

問題是我不能實例化數組,因爲它需要創建一個基類的實例(它不能這樣做,因爲它是抽象的)。但是,如果不這樣做,它沒有分配需要分配給數組索引的內存,因此在嘗試訪問該內存時提供了分段錯誤。我覺得將new和delete與malloc和free混合並不是好習慣。

這可能是我混淆了這個應該使用的方式,我應該嘗試使用模板或其他機制來做到這一點,但希望我已經提供了足夠的信息來說明我正在嘗試做什麼。

那麼做這件事的最好方法是什麼?以及如何解決將內存分配給抽象類的問題?

感謝, 丹

+0

破壞者也應該是虛擬的 – 2008-12-15 18:33:17

+1

+1不要害怕問 – paxos1977 2008-12-16 01:22:56

回答

12

只有在代碼稍有分歧。不要分配Base對象,你必須分配指針。指針可以隨時存在。指向一個抽象類,不完全類型,甚至失效是有效的:

int main(int argc, char* argv[]) 
{ 
    int size = 0; 
    Base** bases = new Base*[10]; 

    bases[size++] = new A(); 
    bases[size++] = new B(); 

    for (int i = 0; i < size; i++) 
    { 
     Base* base = bases[i]; 
     base->Test(); 
    } 
} 
6

首先,確保你的析構函數聲明爲虛:

virtual ~Base(); 

你最好斷存儲指針的數組實例:

Base** bases = new Base *[10]; 
5

陣列依賴於它的所有元件是具有相同大小的。當你有從同一個基礎派生的C++類時,實例可以是任何大小。因此,無論基礎是否抽象,都不能分配基礎實例數組,然後將派生實例放在那裏。

正如其他答案所說,你需要使用指針。分配一個指向數組的指針數組,然後分配各種派生實例並將指針存儲在數組中。