3

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

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

那么最好的方法是什么,我将如何解决将内存分配给抽象类的问题?

谢谢,丹

4

3 回答 3

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();
    }
}
于 2008-12-15T16:47:50.760 回答
6

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

virtual ~Base();

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

Base** bases = new Base *[10];
于 2008-12-15T16:49:33.723 回答
5

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

正如其他答案所说,您需要使用指针。分配一个指向基址的指针数组,然后分配各种派生实例并将指向它们的指针存储在数组中。

于 2008-12-15T16:59:07.743 回答