c++ - 如何使用抽象类为实例数组分配内存?

标签 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();
    }
}

(请原谅我可能犯的任何错误,我正在写这篇文章是为了提供一个简单的例子)。

问题是我无法实例化数组,因为它需要创建基类的实例(它不能这样做,因为它是抽象的)。但是,如果不这样做,它就没有分配分配给数组索引所需的内存,因此在尝试访问该内存时会出现段错误。我的印象是将 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();
    }
}

关于c++ - 如何使用抽象类为实例数组分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/368976/

相关文章:

c# - 如何在 C# 中创建公共(public)但不可继承的方法或属性?

c++ - C++ 元编程中的蹦床

c++ - 超速 vector push_back

c - 为什么标准 C 库中没有像 realloc() 这样不复制数据的函数?

objective-c - 指针和字典: copied or stored?

c++ - 避免虚拟模板

c++ - 如何在QTableView中显示QAbstractItemModel的子行

c++ - 将 Qt 与 Visual Studio Code (Windows) 结合使用

c++ - 宏定义如何用于内存泄漏检测?

c# - 抽象多个 C# 类