作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试了解 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 既有边变量又有 area() 方法
不过,值得一提的是,您实际上并未对任何内容使用 virtual
方法。
关于C++ 继承 : Calling the virtual function of a base class using an instance of a derived class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22723843/
我是一名优秀的程序员,十分优秀!