C++;继承:使用派生类的实例调用基类的虚拟函数 我试图了解C++中的强>虚函数和继承。在下面的示例代码中,我有两个类AreaCube(基类)和SideAreaRatio(派生类)。我试图从派生类中的另一个函数“ratio”调用基类中的虚拟函数“area”。我正试图通过使用基类的一个实例来实现这一点。但由于一些我不熟悉的原因,我看到了奇怪的答案。请告诉我这里发生了什么事 #include<iostream> using namespace std; class AreaCube { public: int side; AreaCube() {}; AreaCube(int s) { side = s; } virtual ~AreaCube() {}; virtual int area() { cout<< "calling.. " << endl; int area = side*side*side; return area; } }; class SideAreaRatio:public AreaCube { public: SideAreaRatio(int s) { side = s; }; ~SideAreaRatio() {}; float ratio() { AreaCube a; int area = a.area(); cout<< area << endl; return (side/area); } }; int main() { AreaCube* ac = new AreaCube(2); cout<< ac->area() << endl; SideAreaRatio* sar = new SideAreaRatio(4); cout<< sar->ratio() << endl; }
生成的输出:C++;继承:使用派生类的实例调用基类的虚拟函数 我试图了解C++中的强>虚函数和继承。在下面的示例代码中,我有两个类AreaCube(基类)和SideAreaRatio(派生类)。我试图从派生类中的另一个函数“ratio”调用基类中的虚拟函数“area”。我正试图通过使用基类的一个实例来实现这一点。但由于一些我不熟悉的原因,我看到了奇怪的答案。请告诉我这里发生了什么事 #include<iostream> using namespace std; class AreaCube { public: int side; AreaCube() {}; AreaCube(int s) { side = s; } virtual ~AreaCube() {}; virtual int area() { cout<< "calling.. " << endl; int area = side*side*side; return area; } }; class SideAreaRatio:public AreaCube { public: SideAreaRatio(int s) { side = s; }; ~SideAreaRatio() {}; float ratio() { AreaCube a; int area = a.area(); cout<< area << endl; return (side/area); } }; int main() { AreaCube* ac = new AreaCube(2); cout<< ac->area() << endl; SideAreaRatio* sar = new SideAreaRatio(4); cout<< sar->ratio() << endl; },c++,oop,inheritance,C++,Oop,Inheritance,生成的输出: calling.. 8 calling.. 8 0.3333 calling.. 8 calling.. -1265467392 0 您正在使用默认构造函数创建的AreaCube的新实例a,该构造函数不会在实例a上设置side的值。此内存不能保证保存任何特定值,当您调用a.area()时,结果将是未定义的 有一个简单的修复方法:替换AreaCube a带有区域立方体a(侧面)并查看您是否获得了正确的行为。或者,您可以完全避免实例化AreaCube的新实例,只需直接调用基
calling..
8
calling..
8
0.3333
calling..
8
calling..
-1265467392
0
您正在使用默认构造函数创建的
AreaCube
的新实例a
,该构造函数不会在实例a
上设置side
的值。此内存不能保证保存任何特定值,当您调用a.area()
时,结果将是未定义的
有一个简单的修复方法:替换AreaCube a代码>带有区域立方体a(侧面)
并查看您是否获得了正确的行为。或者,您可以完全避免实例化AreaCube
的新实例,只需直接调用基类方法:int-area=AreaCube::area()
。请注意,这里不需要传递侧
,因为基类方法在当前对象的(此
)状态下运行
另外,另一个问题将阻止此操作:当您分割两个int
变量时,它将把结果截断为int
。要执行浮点除法,您需要获取以下信息:replacereturn(side/area)代码>带有返回(1.0f*大小/面积)
一切都应该正常。您正在使用默认构造函数创建的AreaCube
的新实例a
,该构造函数不设置实例a
上的侧边的值。此内存不能保证保存任何特定值,当您调用a.area()
时,结果将是未定义的
有一个简单的修复方法:替换AreaCube a代码>带有区域立方体a(侧面)
并查看您是否获得了正确的行为。或者,您可以完全避免实例化AreaCube
的新实例,只需直接调用基类方法:int-area=AreaCube::area()
。请注意,这里不需要传递侧
,因为基类方法在当前对象的(此
)状态下运行
另外,另一个问题将阻止此操作:当您分割两个int
变量时,它将把结果截断为int
。要执行浮点除法,您需要获取以下信息:replacereturn(side/area)代码>带有返回(1.0f*大小/面积)代码>一切都应该正常。在SideAreaRatio
类中,当调用ratio
时,使用默认构造函数(AreaCube()
)创建类型为AreaCube
的新对象,该构造函数不会初始化类的侧
成员字段。接下来,继续对SideAreaRatio
类中仍然未定义的side值执行计算,然后使用默认构造函数(AreaCube()
)创建类型为AreaCube
的新对象调用ratio
时,不会初始化类的端
成员字段。接下来,继续对侧的未定义值执行计算
将浮动比率()更改为
float ratio() {
int area = area();
cout<< area << endl;
return (side/area);
}
浮动比率(){
int面积=面积();
不能将浮动比率()更改为
float ratio() {
int area = area();
cout<< area << endl;
return (side/area);
}
浮动比率(){
int面积=面积();
cout它不起作用,因为您实际上没有用任何值构造AreaCube
对象,所以当它计算面积时,它会给您垃圾(因为side
变量没有值,如调用默认构造函数所示)
我想你想做的是:
#include<iostream>
using namespace std;
class AreaCube {
public:
int side;
AreaCube() {};
AreaCube(int s) {
side = s;
}
virtual ~AreaCube() {};
virtual int area() {
cout<< "calling.. " << endl;
int area = side*side*side;
return area;
}
};
class SideAreaRatio:public AreaCube {
public:
SideAreaRatio(int s) {
side = s;
};
~SideAreaRatio() {};
float ratio() {
int area = area();
cout<< area << endl;
return (side/area);
}
};
int main() {
AreaCube* ac = new AreaCube(2);
cout<< ac->area() << endl;
SideAreaRatio* sar = new SideAreaRatio(4);
cout<< sar->ratio() << endl;
}
#包括
使用名称空间std;
类AreaCube{
公众:
内侧;
AreaCube(){};
AreaCube(int s){
侧面=s;
}
虚拟~AreaCube(){};
虚拟整数区域(){
cout它不起作用,因为您实际上没有用任何值构造AreaCube
对象,所以当它计算面积时,它会给您垃圾(因为side
变量没有值,如调用默认构造函数所示)
我想你想做的是:
#include<iostream>
using namespace std;
class AreaCube {
public:
int side;
AreaCube() {};
AreaCube(int s) {
side = s;
}
virtual ~AreaCube() {};
virtual int area() {
cout<< "calling.. " << endl;
int area = side*side*side;
return area;
}
};
class SideAreaRatio:public AreaCube {
public:
SideAreaRatio(int s) {
side = s;
};
~SideAreaRatio() {};
float ratio() {
int area = area();
cout<< area << endl;
return (side/area);
}
};
int main() {
AreaCube* ac = new AreaCube(2);
cout<< ac->area() << endl;
SideAreaRatio* sar = new SideAreaRatio(4);
cout<< sar->ratio() << endl;
}
#包括
使用名称空间std;
类AreaCube{
公众:
内侧;
AreaCube(){};
AreaCube(int s){
侧面=s;
}
虚拟~AreaCube(){};
虚拟整数区域(){
不能在这里
相反
或者你可以打电话
area()
直接创建AreaCube的新对象,即
float ratio() {
return (side/area());
}
你打电话的原因是什么
area()
直接的原因是这个方法是在基类中定义的。在这种情况下,即使它没有定义为虚拟的,你也可以使用它。你可以试试看,结果是一样的
基本上,您的代码不是虚拟函数的正确实现。此处
float ratio() {
AreaCube a;
int area = a.area();
cout<< area << endl;
return (side/area);
}
相反
或者你可以打电话
area()
直接创建AreaCube的新对象,即
float ratio() {
return (side/area());
}
你打电话的原因是什么
area()
直接的原因是这个方法是在基类中定义的。在这种情况下,即使它没有定义为虚拟的,你也可以使用它。你可以试试看,结果是一样的
基本上,您的代码不是正确的虚拟函数实现。使用调试器,您应该在几秒钟内找到问题。使用调试器,您应该在几秒钟内找到问题。不客气。当您从基类继承时,您可以