gpt4 book ai didi

c++ - 从派生类调用虚函数崩溃

转载 作者:搜寻专家 更新时间:2023-10-31 01:42:15 25 4
gpt4 key购买 nike

我有一个基础抽象类和 2 个来自基础的派生类。当我从派生类调用函数时,程序崩溃了!!这是代码!

我的基类

class product{
protected:
float ipsos,aktina;
int n;
public:
product(){};
virtual float getvolume() =0;
};

我的派生类

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;
}

我有另外 1 个派生类,它有另一个 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() 之前一直运行良好,在那里它崩溃了,我不明白问题出在哪里!

最佳答案

问题是您正在使用 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[] 这个数组,您可以从我的演示中看到编译器正在提示(相当奇怪,我可能会补充)未初始化的数据成员。您应该修复这些问题(并打开编译器警告)。

关于c++ - 从派生类调用虚函数崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27215303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com