C++ 对象继承虚拟函数运行失败错误 Shape*Shape[100]//全球范围 平方米//全球范围 void inputdata(){ 内透镜,宽度; cout>len; 宽度; 方形sqr(长度、宽度); 形状[0]=&sqr; //---->如果shape[0]->computeArea();这里可以正常工作。 } 无效计算区域(){ 形状[0]->computeArea();//-->运行失败错误 }

C++ 对象继承虚拟函数运行失败错误 Shape*Shape[100]//全球范围 平方米//全球范围 void inputdata(){ 内透镜,宽度; cout>len; 宽度; 方形sqr(长度、宽度); 形状[0]=&sqr; //---->如果shape[0]->computeArea();这里可以正常工作。 } 无效计算区域(){ 形状[0]->computeArea();//-->运行失败错误 },c++,object,inheritance,polymorphism,virtual,C++,Object,Inheritance,Polymorphism,Virtual,Shape是父类,square是子类。两者都有计算区域() 当代码到达computeArea()时,我遇到了一个奇怪的运行失败错误。程序只是终止,没有给我任何错误,让我找到并修复它…它只是显示运行失败并停止程序 如果代码在inputdata()中,程序可以正常运行并显示->computerea(),但当我将其分离时,它就无法正常运行。有什么解决方案吗?方形sqr(长度,宽度)创建一个自动对象。当函数返回时,它会消失,即使它的地址已存储在形状[0]Square sqr(len,width)中,也会

Shape是父类,square是子类。两者都有计算区域()

当代码到达computeArea()时,我遇到了一个奇怪的运行失败错误。程序只是终止,没有给我任何错误,让我找到并修复它…它只是显示运行失败并停止程序


如果代码在inputdata()中,程序可以正常运行并显示->computerea(),但当我将其分离时,它就无法正常运行。有什么解决方案吗?

方形sqr(长度,宽度)创建一个自动对象。当函数返回时,它会消失,即使它的地址已存储在
形状[0]

Square sqr(len,width)
中,也会创建一个自动对象。当函数返回时,它会消失,即使它的地址已存储在
形状[0]
正方形中

Shape *shape[100];//global scope
Square sqr;//global scope


void inputdata() {
int len,width;
cout << "enter length";
cin >> len;
cout << "enter width";
cin >> width;

Square sqr(len,width);
shape[0] = &sqr;
//----> if shape[0]->computeArea(); here works fine.
}

void computeArea() {
shape[0]->computeArea(); // --> run fail error
}
inputdata
范围内的本地实例。一旦您离开该范围,您将在
形状[0]
中看到一个悬空的指针。如果要设置全局
sqr
,则需要

Square sqr(len,width);

您应该找到一个不依赖全局变量的解决方案。

这个
平方

Shape *shape[100];//global scope
Square sqr;//global scope


void inputdata() {
int len,width;
cout << "enter length";
cin >> len;
cout << "enter width";
cin >> width;

Square sqr(len,width);
shape[0] = &sqr;
//----> if shape[0]->computeArea(); here works fine.
}

void computeArea() {
shape[0]->computeArea(); // --> run fail error
}
inputdata
范围内的本地实例。一旦您离开该范围,您将在
形状[0]
中看到一个悬空的指针。如果要设置全局
sqr
,则需要

Square sqr(len,width);

不过,您应该找到一种不依赖全局变量的解决方案。

通过以下方式更改代码:

sqr = Square(len,width);
Shape*Shape[100]//全球范围
正方形*sqr//全局范围//使其成为指针或引用
void inputdata(){
内透镜,宽度;
cout>len;
宽度;
sqr=新正方形(长度、宽度);
shape[0]=sqr;//在此处删除(&H)
}
无效计算区域(){
形状[0]->computeArea();
}

通过以下方式更改代码:

sqr = Square(len,width);
Shape*Shape[100]//全球范围
正方形*sqr//全局范围//使其成为指针或引用
void inputdata(){
内透镜,宽度;
cout>len;
宽度;
sqr=新正方形(长度、宽度);
shape[0]=sqr;//在此处删除(&H)
}
无效计算区域(){
形状[0]->computeArea();
}

从您发布的代码中,我看不到问题,您可能在其他地方有错误的东西。从您发布的代码中,我看不到问题,您可能在其他地方有错误的东西。不需要这种动态分配。@juanchopanza动态分配有什么问题?没有必要,为什么要使用它?现在你有了一个需要跟踪和删除的资源。@juanchopanza好的,我知道了。跟踪并删除它让我信服。没有必要使用这种动态分配。@juanchopanza动态分配有什么问题?没有必要,为什么要使用它?现在你有了一个需要跟踪和删除的资源。@juanchopanza好的,我知道了。跟踪并删除它使我信服。