2008-12-15 68 views
3

我有一个抽象类在C++定义的纯虚方法:如何使用抽象类将内存分配给实例数组?

class Base 
{ 
Base(); 
~Base(); 

virtual bool Test() = 0; 
}; 

我已经与一些其它类的,我将称之为(其为试验()提供一个实现)的子类此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混合并不是好习惯。

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

那么做这件事的最好方法是什么?以及如何解决将内存分配给抽象类的问题?

感谢, 丹

+0

破坏者也应该是虚拟的 – 2008-12-15 18:33:17

+1

+1不要害怕问 – paxos1977 2008-12-16 01:22:56

回答

12

只有在代码稍有分歧。不要分配Base对象,你必须分配指针。指针可以随时存在。指向一个抽象类,不完全类型,甚至失效是有效的:

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

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

virtual ~Base(); 

你最好断存储指针的数组实例:

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

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

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