【问题标题】:C++ polygon rectangle and triangle inheritanceC++多边形矩形和三角形继承
【发布时间】:2015-01-11 08:57:29
【问题描述】:

我正在尝试创建一个 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++ 很陌生...

【问题讨论】:

  • 向 Polygon 类添加默认构造函数。
  • 确实我的许多问题都解决了,但我仍然收到最后一个 38 错误

标签: c++ inheritance


【解决方案1】:

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

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();
};

【讨论】:

  • 嗯,我现在得到:37 没有匹配函数调用 `Rectangle::Rectangle(int, int)'
  • @user3265784 抱歉,我之前没有编译,你应该为每个子类添加构造函数。我更新了代码。
【解决方案2】:

要构造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 定义它:

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);

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-14
      • 2012-09-28
      • 2022-06-30
      • 1970-01-01
      • 2023-01-30
      • 2018-08-22
      • 2016-03-25
      相关资源
      最近更新 更多