[英]How to allocate memory to an array of instances using an abstract class?
我有一個抽象類在c ++中定義一個純虛方法:
class Base
{
Base();
~Base();
virtual bool Test() = 0;
};
我已經將其子類化了許多其他類(它們為Test()提供了一個實現),我將其稱為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();
}
}
(請原諒我可能犯的任何錯誤,我正在寫這篇文章提供一個簡單的例子)。
問題是我無法實例化數組,因為它需要創建一個Base類的實例(它不能像它的抽象那樣做)。 但是,如果不這樣做,它就沒有分配分配給數組索引所需的內存,因此在嘗試訪問該內存時會提供分段錯誤。 我的印象是,將new和delete與malloc和free混合起來並不是一個好習慣。
可能是我混淆了應該使用它的方式,我應該嘗試使用模板或其他一些機制來做到這一點,但希望我提供了足夠的信息來說明我正在嘗試做什么。
那么這樣做的最佳方法是什么?如何解決將內存分配給抽象類的問題?
謝謝,丹
該代碼只有輕微的誤解。 您必須分配指針,而不是分配Base對象。 指針可以隨時存在。 指向抽象類,不完整類型甚至void的指針是有效的:
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();
}
}
首先,確保析構函數也聲明為虛擬:
virtual ~Base();
你最好存儲一個指向實例的指針數組:
Base** bases = new Base *[10];
數組依賴於其所有元素具有相同的大小。 當您擁有從相同基礎派生的C ++類時,實例可以是任何大小。 因此,無論基礎是否為抽象,您都不能分配基本實例數組,然后將派生實例放在那里。
正如其他答案所說,你需要使用指針。 將一個指針數組分配給base,然后分配各種派生實例並將指針存儲到數組中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.