#include <iostream>
#include <stdlib.h>
using namespace std;
class area
{
public:
int l,b;
int enter()
{
cout<<"Enter Length: ";
cin>>l;
cout<<"Enter Breadth: ";
cin>>b;
}
};
class rectangle : public area
{
public:
int arr()
{
cout<<"Area of Rectangle is: "<<l*b;
}
};
int main ()
{
area obj;
rectangle ob;
obj.enter();
ob.arr();
}
我可以输入值,但结果显示为“344765440”。告诉我我的代码是否有问题。而且我也无法正确使用继承。我不能使用“区域”类的对象。
要解决的第一个基本问题是您的函数不返回任何内容,而是声明为 return int
。通过将它们转换为void
函数来解决这个问题;否则,您将遇到未定义的行为。
获得看似随机的输出是未定义行为的常见结果,尽管在这种情况下它很可能是由另一个未定义行为实例引起的。
为了找到未定义行为的其他实例,让我们从查看这段代码开始:
area obj; rectangle ob;
这将创建两个不同的area
对象。
obj
,它只是一个area
.ob
,它是一个rectangle
,因此包含另一个area
作为子对象。l
并且b
在两个area
对象中都未初始化。
然后你调用成员函数......
obj.enter();
这将在第一个对象中设置l
和b
数据成员area
。
ob.arr();
这会尝试从第二个对象( 的子对象)中尚未初始化的成员l
和b
数据成员中读取数据。尝试从未初始化的读取同样是未定义的行为。area
rectangle
int
您要做的只是创建一个rectangle
对象,该对象已经包含area
. 难道不是创建一个单独的area
对象!
这是您的代码的修改版本,其中包含两个修复程序:
#include <iostream>
class area
{
public:
int l;
int b;
void enter()
{
std::cout<<"Enter Length: ";
std::cin>>l;
std::cout<<"Enter Breadth: ";
std::cin>>b;
}
};
class rectangle : public area
{
public:
void arr()
{
std::cout<<"Area of Rectangle is: "<<l*b;
}
};
int main ()
{
rectangle ob;
ob.enter();
ob.arr();
}
您可能还想重新考虑您对继承的使用,并回顾您对面向对象理论的理解。请记住,公共继承具有is-a的含义。你认为一个矩形是一个区域吗?我会说一个矩形有一个区域。Has-a 关系应该用成员身份来表达,即通过rectangle
拥有一个area
数据成员。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句