C ++多边形矩形和三角形继承

时间:2014-11-14 02:35:55

标签: c++ inheritance

我正在尝试创建一个继承第一个的Polygon类和一个Rectangle和Triangle。 Polygon类有高度和宽度变量,我希望它们在构造函数中给定值。然后,矩形和三角形具有面积计算方法。然后,我使用main()给出一些例子。我用:

#include <iostream>
using namespace std;

class Polygon {
    public:
        Polygon(int, int);
    protected:
        int height;
        int width;
};

class Rectangle: public Polygon {
    public:
        void calc_area();
};

class Triangle: public Polygon {
    public:
        void calc_area();
};

Polygon::Polygon(int a, int b) {
    height = a;
    width = b;
}

void Rectangle::calc_area() {
    cout << "Rectangle area: " << (height*width) << endl;
}

void Triangle::calc_area() {
    cout << "Triangle area: " << (height*width/2) << endl;
}

int main() {
    Rectangle s1(5, 2);
    Triangle s2(5, 2);
    s1.calc_area();
    s2.calc_area();
}

但是,虽然我的新手眼睛看起来都很好,但我得到了一系列错误:

12 base Polygon',类中只有非默认构造函数,没有构造函数`

36没有匹配函数来调用`Rectangle :: Rectangle(int,int)

37没有匹配函数来调用`Triangle :: Triangle(int,int)'

有人可以给我一些提示吗?如上所示,我对C ++很新...

3 个答案:

答案 0 :(得分:2)

您不应该调用构造函数来使用.,例如:

Rectangle s1;
Triangle s2;
s1.Polygon(5, 2);
s2.Polygon(5, 2);

尝试这种方式:

Rectangle s1(5, 2);
Triangle  s2(5, 2);

您应该分别为RectangleTriangle添加构造函数:

class Rectangle: public Polygon {
public:
    Rectangle(int height, int width):Polygon(height, width){}
    void calc_area();
};

class Triangle: public Polygon {
public:
    Triangle(int height, int width):Polygon(height, width){}
    void calc_area();
};

答案 1 :(得分:0)

要构建TriangleRectangle,您正在调用它们不可见的默认构造函数。

所以Triangle()Rectangle()方法。这些实现为空方法,但它们还必须调用它们继承的任何类的默认构造函数。实际上,这就是生成的代码:

Triangle() : Polygon() {}
Rectangle() : Polygon() {}

Polygon将不会获得默认构造函数,因为您创建了自己的构造函数。因此,获得回报的唯一方法是定义它:

Polygon() {}

或者在C ++ 11中:

Polygon() = default;

实例化成员变量时会调用默认构造函数Triangle()Rectangle()。所以这些行调用构造函数:

Rectangle s1;
Triangle s2;

请注意,构建它们后,无法重建。所以这些电话是非法的:

s1.Polygon(5, 2);
s2.Polygon(5, 2);

现在,如果你想完成一个设置构造函数,可以这样做,但是你需要为TriangleRectangle定义它:< / p>

Triangle(int width, int height) : Polygon(width, height) {}
Triangle(int width, int height) : Polygon(width, height) {}

再次回想一下,定义这些方法将导致不为TriangleRectangle生成默认构造函数。因此,您的s1s2声明现在将是非法的,但这样做是正确的,因为您无论如何都希望用新的构造函数声明它们:

Rectangle s1(5, 2);
Triangle s2(5, 2);

答案 2 :(得分:0)

你必须用这种方式...... Rectangle *s1 = new Rectangle; s1->ab(5,2); s1->calc_area();