这不是家庭作业,只是我的C ++课程的一些训练练习,以便习惯于继承和东西。所以练习的第一部分要求我们创建一个程序,它有一个类名Rectangle,我们应该做构造函数getter和setter,找到区域和周长。这部分工作正常。练习的第二部分说是创建一个新的类名Square,它扩展了Rectangle,它有一个构造函数,它将广场的宽度作为参数。然后程序应该打印区域和周边。
#include <iostream>
using namespace std;
class Rectangular {
private:
int width;
int height;
public:
Rectangular () {
width = 5;
height = 5;
}
Rectangular (int w, int h) {
width = w;
height = h;
}
void setWidth (int w) {
width = w;
}
void setHeight (int h) {
height = h;
}
int getWidth () {
return width;
}
int getHeight () {
return height;
}
int getArea () {
return width*height;
}
int getPerimeter () {
return width+height;
}
};
class Square : public Rectangular{
public:
Square (int w) {
getWidth();
}
};
int main(int argc,char *argv[])
{
Rectangular a, b(10,12);
Square c(5);
cout << "Width for a: " << a.getArea() << " Perimeter for a: " << a.getPerimeter() << endl;
cout << "Width for b: " << b.getArea() << " Perimeter for b: " << b.getPerimeter() << endl;
cout << "Area for c: " << c.getArea() << " Perimeter for c: " << c.getPerimeter() << endl;
}
程序打印出来
Width for a: 25 Perimeter for a: 10
Width for b: 120 Perimeter for b: 22
Area for c: 25 Perimeter for c: 10
由于某种原因,c获得a的值。有什么想法吗?
答案 0 :(得分:5)
您忘记链接Square
的构造函数。您想要将Square
的构造函数更改为:
Square(int w) : Rectangle(w,w) {}
答案 1 :(得分:2)
您的a
未在其构造函数中定义任何值,因此其为5x5。您为c
指定的内容(此处也未定义初始宽度/高度 - 请注意,您不调用Rectangular
的任何特定构造函数,因此使用默认值)。因此,它不是“从中获取价值”,而是以同样的方式初始化。
答案 2 :(得分:1)
继承类Square
中的构造函数应为:
Square(int w) : Rectangular (w, w)
{
/* do what ever */
getWidth();
}
getWidth ()
来电的用途是什么?删除它。
EDIT1 :
注意:cout<<"Width for a: "<<a.getArea()<<" Perimeter for a: "<<a.getPerimeter()<<endl;
您已撰写"Width for a: "
,但实际上已通过调用a.get_Area ();
答案 3 :(得分:0)
正在发生的事情是,b是使用您设置的width
和height
创建的(相应地为10和12),默认情况下创建的是5和5。
如果你看,你的Square
是使用你的默认构造函数创建的,因为你的getWidth()
调用(和整体)创建了一个父实例(使用它的默认构造函数),它将它设置为5 5。
因此,你得到相同的a和c。
答案 4 :(得分:0)
这个练习实际上是一个糟糕的继承使用的好例子:)虽然在数学上方形总是一个矩形,但是当你尝试用C ++建模它时,它可能很棘手。
示例:LuxuryCar
的实例始终可以在需要Car
的地方使用;但是,Square
不能总是使用Rectangle
而不是Square
(例如此窗口)。
为了说明您的实施情况,您的setWidth
会继承setHeight
和Rectangle
方法。如果你在广场上使用它们,你就会破坏它 - 它不再是正方形。所以你需要覆盖它们,以便保持正方形的约束。但如果你这样做,我不确定你从Square
继承你获得了什么。另外,{{1}}提供了一个与其性质不一致的API(方法集)(显然没有宽度)。