我有一个基础抽象类和2个派生类。 当我从派生类调用函数时程序崩溃!! 这是代码!
我的基类
class product{
protected:
float ipsos,aktina;
int n;
public:
product(){};
virtual float getvolume() =0;
};
My Derived class
class product1:public product{
public:
product1();
float getakt(){return aktina;};
float getips(){return ipsos;};
float getvolume();
};
product1::product1(){
//inputing aktina,ipsos,n
}
float product1::getvolume(void){
return (3.14)*aktina*aktina*ipsos;
}
我有另外一个派生类,它有另一个getvolume()的实现。 这是我的主要内容:
int main(){
int i;float v;
product1 *p1;
product2 *p2;
if((p1=(product1*)malloc(2*sizeof(product1)))==NULL){
cout <<"Not enough memory for 2"<< "objects" << endl;
exit(1);
}
for(i=0;i<2;i++){
product1 temp;
p1[i]=temp;
}
cout<<p1[0].getakt()<<" "<<p1[0].getips();
v=p1[0].getvolume();
cout<<v;
return 1;
}
程序运行正常,直到它转到v = p1 [0] .getvolume(),它崩溃了,我无法理解问题是什么!
答案 0 :(得分:3)
问题是您使用的是malloc
。
malloc
是一个C库函数,它分配内存并返回指向该内存的指针。它不会调用构造函数,也不会设置虚拟表,因此your program is entirely broken因此:您对虚函数getVolume()
的调用无法正常工作。
在C ++中,尤其是在使用运行时多态时,我们改为使用new
。
当我更改以下行时:
if((p1=(product1*)malloc(2*sizeof(product1)))==NULL){
为:
if((p1=new product1[2])==NULL){
the segmentation fault goes away
在程序结束时你还必须delete[]
这个数组,你可以从我的演示中看到编译器抱怨(相当奇怪,我可能会添加)关于未初始化的数据成员。你应该修复它们(并在编译器警告上转动)。