簡體   English   中英

如何使用抽象類將內存分配給實例數組?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM