我试图了解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;
}
预期产量:
calling..
8
calling..
8
0.3333
产生的输出:
calling..
8
calling..
-1265467392
0
这是行不通的,因为您实际上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;
}
您不需要实例化AreaCube
派生类内部的内容,因为所需的一切已经存在。只需调用该area()
方法即可。
从基类继承时,将保留所有成员变量和成员函数,因此除了派生类外,您无需实例化其他任何东西。因此,在这种情况下,SideAreaRatio同时具有side变量和area()方法
值得一提的是,您实际上并没有使用该virtual
方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句