从派生类崩溃调用虚函数

时间:2014-11-30 16:17:51

标签: c++

我有一个基础抽象类和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(),它崩溃了,我无法理解问题是什么!

1 个答案:

答案 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[]这个数组,你可以从我的演示中看到编译器抱怨(相当奇怪,我可能会添加)关于未初始化的数据成员。你应该修复它们(并在编译器警告上转动)。