gpt4 book ai didi

C++ 继承 : Calling the virtual function of a base class using an instance of a derived class

转载 作者:行者123 更新时间:2023-11-30 00:51:13 31 4
gpt4 key购买 nike

我正在尝试了解 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/

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