继承和构造函数

Inheritance and Constructors

本文关键字:构造函数 继承      更新时间:2023-10-16

这不是家庭作业,只是我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 的值。 有什么想法吗?

您忘记链接构造函数 Square .您希望将 Square 的构造函数更改为:

  Square(int w) : Rectangle(w,w) {}

您的a没有在其构造函数中定义任何值,因此其为5x5。您为c指定的相同(您在此处也没有定义初始宽度/高度 - 请注意,您不调用任何特定的 Rectangular 构造函数,因此使用默认值(。因此,它不是"从中获取值",而是简单地以相同的方式初始化。

继承

Square中的构造函数应该是:

     Square(int w) :  Rectangular (w, w)
     {
       /* do what ever */
       getWidth();
     }

getWidth ()调用有什么用? 删除它。

编辑1

注:cout<<"Width for a: "<<a.getArea()<<" Perimeter for a: "<<a.getPerimeter()<<endl;

您已经写了"Width for a: "但实际上已经打印了该区域,通过调用a.get_Area ();

正在发生的事情是,b 是用你设置的widthheight创建的(相应地是 10 和 12(,默认情况下使用 5 和 5 创建 a。如果你看一下,你的Square是使用默认构造函数创建的,由于你的getWidth()调用(以及整体(创建了一个父实例(使用它的默认构造函数(,将其设置为 5 对 5。因此,你得到相同的a和c。

这个练习实际上是错误使用继承:)的一个很好的例子虽然在数学上正方形总是一个矩形,但当您尝试用C++建模时,可能会很棘手。

示例:LuxuryCar 的实例始终可以在预期Car的地方使用;但是不能总是使用 Square 代替Rectangle(例如此窗口(。

为了在您的实现中说明这一点 - 您的 Square 继承了 setWidthsetHeight 方法。如果你在一个正方形上使用它们,你就会打破它——它不再是一个正方形了。因此,您需要覆盖它们,以便保持正方形的约束。但如果你这样做,我不确定你从Rectangle继承有什么收获.此外,Square提供了一个与其性质不一致的API(方法集((显然没有平方宽度(。