C++继承与组合的综合应用案例
时间: 2024-02-27 15:52:45 浏览: 33
好的,下面是一个关于C++继承与组合的综合应用案例:
假设我们要设计一个简单的图形库,其中包含矩形、圆形和三角形三种基本图形类型。每个图形都有自己的颜色和大小属性,并且可以计算出它的周长和面积。
我们可以使用C++中的继承和组合来实现这个图形库。具体来说,我们可以定义一个基类Shape,它包含颜色和大小两个属性,以及计算周长和面积的虚函数。然后,我们可以从Shape派生出三个类Rectangle、Circle和Triangle,分别实现它们自己的计算周长和面积的方法。
此外,我们还可以定义一个Color类和一个Size类,分别表示颜色和大小。然后,在Shape类中使用组合的方式,将Color和Size对象作为成员变量,以便每个图形都可以拥有自己的颜色和大小属性。
下面是一个示例代码,用于实现上述功能:
```
class Color {
public:
Color(int r, int g, int b) : m_r(r), m_g(g), m_b(b) {}
int getRed() const { return m_r; }
int getGreen() const { return m_g; }
int getBlue() const { return m_b; }
private:
int m_r, m_g, m_b;
};
class Size {
public:
Size(int w, int h) : m_w(w), m_h(h) {}
int getWidth() const { return m_w; }
int getHeight() const { return m_h; }
private:
int m_w, m_h;
};
class Shape {
public:
Shape(const Color& color, const Size& size) : m_color(color), m_size(size) {}
virtual double getArea() const = 0;
virtual double getPerimeter() const = 0;
protected:
Color m_color;
Size m_size;
};
class Rectangle : public Shape {
public:
Rectangle(const Color& color, const Size& size) : Shape(color, size) {}
double getArea() const override { return m_size.getWidth() * m_size.getHeight(); }
double getPerimeter() const override { return 2 * (m_size.getWidth() + m_size.getHeight()); }
};
class Circle : public Shape {
public:
Circle(const Color& color, const Size& size) : Shape(color, size) {}
double getArea() const override { return 3.14 * m_size.getWidth() * m_size.getHeight() / 4; }
double getPerimeter() const override { return 3.14 * (m_size.getWidth() + m_size.getHeight()); }
};
class Triangle : public Shape {
public:
Triangle(const Color& color, const Size& size) : Shape(color, size) {}
double getArea() const override { return m_size.getWidth() * m_size.getHeight() / 2; }
double getPerimeter() const override { return m_size.getWidth() + m_size.getHeight() + sqrt(m_size.getWidth() * m_size.getWidth() + m_size.getHeight() * m_size.getHeight()); }
};
```
使用上述代码,我们可以创建各种图形对象,并计算它们的周长和面积,例如:
```
Color red(255, 0, 0);
Size size(10, 20);
Rectangle rect(red, size);
double area = rect.getArea(); // 200
double perimeter = rect.getPerimeter(); // 60.0
Color green(0, 255, 0);
Size size(15, 15);
Circle circle(green, size);
double area = circle.getArea(); // 176.625
double perimeter = circle.getPerimeter(); // 94.2
Color blue(0, 0, 255);
Size size(8, 10);
Triangle tri(blue, size);
double area = tri.getArea(); // 40
double perimeter = tri.getPerimeter(); // 29.2111
```