c++设计一个抽象类Shape,它表示具有形状的东西,并体现了抽象的概念,在它下面可以派生出多种具体形状,比如三角形、矩形等。
时间: 2024-03-03 10:51:37 浏览: 21
好的,以下是一个简单的示例代码:
```cpp
class Shape {
public:
virtual double area() const = 0; // 纯虚函数,表示该函数需要在派生类中实现
virtual double perimeter() const = 0; // 纯虚函数
virtual ~Shape() {} // 带有纯虚函数的类需要一个虚析构函数,以便正确释放派生类的资源
};
```
在上述代码中,`Shape` 是一个抽象类,它包含了两个纯虚函数 `area()` 和 `perimeter()`。纯虚函数是在基类中声明但没有定义的函数,它的作用是要求派生类必须实现这个函数。由于 `Shape` 中有纯虚函数,因此它也是一个抽象类,不能被直接实例化。
现在我们可以通过派生类来实现具体的形状,比如三角形和矩形。以下是一个三角形类的示例代码:
```cpp
class Triangle : public Shape {
public:
Triangle(double base, double height) : base_(base), height_(height) {}
double area() const override { return 0.5 * base_ * height_; }
double perimeter() const override { return 0; } // 三角形没有周长,这里返回0
private:
double base_, height_;
};
```
在上述代码中,`Triangle` 是一个具体类,它从 `Shape` 派生而来,并实现了 `area()` 和 `perimeter()` 函数。`Triangle` 的构造函数需要传入三角形的底边和高,它们被保存在 `base_` 和 `height_` 成员变量中。`area()` 函数计算三角形的面积,`perimeter()` 函数返回0,因为三角形没有周长。
同样的,我们可以定义一个矩形类:
```cpp
class Rectangle : public Shape {
public:
Rectangle(double width, double height) : width_(width), height_(height) {}
double area() const override { return width_ * height_; }
double perimeter() const override { return 2 * (width_ + height_); }
private:
double width_, height_;
};
```
在上述代码中,`Rectangle` 也是一个具体类,它从 `Shape` 派生而来,并实现了 `area()` 和 `perimeter()` 函数。`Rectangle` 的构造函数需要传入矩形的宽度和高度,它们被保存在 `width_` 和 `height_` 成员变量中。`area()` 函数计算矩形的面积,`perimeter()` 函数计算矩形的周长。
现在我们可以使用这些类来创建具体的对象,并调用它们的函数:
```cpp
int main() {
Shape* s1 = new Triangle(3, 4);
Shape* s2 = new Rectangle(2, 5);
cout << s1->area() << endl; // 输出 6
cout << s1->perimeter() << endl; // 输出 0
cout << s2->area() << endl; // 输出 10
cout << s2->perimeter() << endl; // 输出 14
delete s1;
delete s2;
return 0;
}
```
在上述代码中,我们创建了一个指向 `Triangle` 对象的指针 `s1`,和一个指向 `Rectangle` 对象的指针 `s2`。然后,我们分别调用它们的 `area()` 和 `perimeter()` 函数,并输出结果。最后,我们需要手动释放这些对象的内存,以避免内存泄漏。这里使用 `delete` 操作符来释放内存。