继承与构造

时间:2011-05-30 16:41:53

标签: c++ inheritance constructor

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

5 个答案:

答案 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是使用您设置的widthheight创建的(相应地为10和12),默认情况下创建的是5和5。 如果你看,你的Square是使用你的默认构造函数创建的,因为你的getWidth()调用(和整体)创建了一个父实例(使用它的默认构造函数),它将它设置为5 5。 因此,你得到相同的a和c。

答案 4 :(得分:0)

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

示例:LuxuryCar的实例始终可以在需要Car的地方使用;但是,Square不能总是使用Rectangle而不是Square(例如此窗口)。

为了说明您的实施情况,您的setWidth会继承setHeightRectangle方法。如果你在广场上使用它们,你就会破坏它 - 它不再是正方形。所以你需要覆盖它们,以便保持正方形的约束。但如果你这样做,我不确定你从Square继承你获得了什么。另外,{{1}}提供了一个与其性质不一致的API(方法集)(显然没有宽度)。