Dan*_*Dan 3 c++ memory abstraction
我有一个抽象类在c ++中定义一个纯虚方法:
class Base
{
Base();
~Base();
virtual bool Test() = 0;
};
Run Code Online (Sandbox Code Playgroud)
我已经将其子类化了许多其他类(它们为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();
}
}
Run Code Online (Sandbox Code Playgroud)
(请原谅我可能犯的任何错误,我正在写这篇文章提供一个简单的例子).
问题是我无法实例化数组,因为它需要创建一个Base类的实例(它不能像它的抽象那样做).但是,如果不这样做,它就没有分配分配给数组索引所需的内存,因此在尝试访问该内存时会提供分段错误.我的印象是,将new和delete与malloc和free混合起来并不是一个好习惯.
可能是我混淆了应该使用它的方式,我应该尝试使用模板或其他一些机制来做到这一点,但希望我提供了足够的信息来说明我正在尝试做什么.
那么这样做的最佳方法是什么?如何解决将内存分配给抽象类的问题?
谢谢,丹
Joh*_*itb 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();
}
}
Run Code Online (Sandbox Code Playgroud)
首先,确保析构函数也声明为虚拟:
virtual ~Base();
Run Code Online (Sandbox Code Playgroud)
你最好存储一个指向实例的指针数组:
Base** bases = new Base *[10];
Run Code Online (Sandbox Code Playgroud)
小智 5
数组依赖于其所有元素具有相同的大小.当您从同一个基础派生C++类时,实例可以是任何大小.因此,无论基础是否为抽象,您都不能分配基本实例数组,然后将派生实例放在那里.
正如其他答案所说,你需要使用指针.将一个指针数组分配给base,然后分配各种派生实例并将指针存储到数组中.
| 归档时间: |
|
| 查看次数: |
4956 次 |
| 最近记录: |