如何使用抽象类将内存分配给实例数组?

时间:2008-12-15 16:44:50

标签: c++ memory abstraction

我有一个在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混合起来并不是一个好习惯。

我可能会混淆应该使用它的方式,我应该尝试使用模板或其他机制来做到这一点,但希望我提供了足够的信息来说明我正在尝试做什么。

那么这样做的最佳方法是什么?如何解决将内存分配给抽象类的问题?

谢谢, 丹

3 个答案:

答案 0 :(得分:12)

该代码只有轻微的误解。您必须分配指针,而不是分配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();
    }
}

答案 1 :(得分:6)

首先,确保您的析构函数也被声明为虚拟:

virtual ~Base();

最好存储一个指向实例的指针数组:

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

答案 2 :(得分:5)

数组依赖于所有相同大小的元素。当您拥有从相同基础派生的C ++类时,实例可以是任何大小。因此,无论基础是否为抽象,您都不能分配基本实例数组,然后将派生实例放在那里。

正如其他答案所说,你需要使用指针。将一个指针数组分配给base,然后分配各种派生实例并将指针存储到数组中。