定义一个类Rectangle代表矩形,其中包括计算面积的方法。再定义一个它的子类Square代表正方形],其中也包含计算面积的方法。编写一程序,测试新建子类对象的属性和方法。 Python代码
时间: 2024-01-21 19:19:23 浏览: 36
下面是Python的代码实现:
```python
# 定义矩形类
class Rectangle:
def __init__(self, length, width):
self.length = length
self.width = width
# 计算面积
def area(self):
return self.length * self.width
# 定义正方形类,继承自矩形类
class Square(Rectangle):
def __init__(self, side):
# 调用父类的构造函数
super().__init__(side, side)
# 创建矩形对象,并计算面积
r = Rectangle(5, 10)
print("矩形的面积:", r.area())
# 创建正方形对象,并计算面积
s = Square(5)
print("正方形的面积:", s.area())
```
运行结果:
```
矩形的面积: 50
正方形的面积: 25
```
相关问题
Python设计一个形状类shape,这个类包括构造方法和周长方法: (1)定义一个矩形类Rectangle,矩形类继承形状类,矩形类中实现求周长方法 (2)定义正方形类square继承矩形类,正方形
在Python中,你可以按照以下步骤设计一个基础的`Shape`类和它的子类`Rectangle`和`Square`:
首先,我们创建一个抽象的`Shape`类,作为所有形状的基类,包含一个构造方法和一个计算周长的抽象方法:
```python
from abc import ABC, abstractmethod
class Shape(ABC):
def __init__(self, name):
self.name = name
@abstractmethod
def perimeter(self):
pass
def __str__(self):
return f"{self.name} shape"
# 父类 Shape 的抽象方法 perimeter 未实现
```
接下来,我们定义`Rectangle`类,它继承自`Shape`,并实现`perimeter`方法:
```python
class Rectangle(Shape):
def __init__(self, length, width):
super().__init__("Rectangle")
self.length = length
self.width = width
def perimeter(self):
return 2 * (self.length + self.width)
# 可选:添加一个边长为0的检查,防止除以0错误
def _check_length_width(self):
if self.length <= 0 or self.width <= 0:
raise ValueError("Length and width must be positive.")
def __str__(self):
return f"{self.name}(Length: {self.length}, Width: {self.width})"
```
然后,定义`Square`类,它继承自`Rectangle`,因为正方形是特殊的矩形,所以它可以直接继承矩形的属性,并且长度和宽度相等:
```python
class Square(Rectangle):
def __init__(self, side):
super().__init__(side, side)
```
现在,你已经创建了一个基础的形状类结构,包括抽象的`Shape`,具体实现的`Rectangle`,以及作为`Rectangle`子类的`Square`。如果需要使用这些类,你可以这样做:
```python
# 创建一个矩形实例
rect = Rectangle(4, 6)
print(rect.perimeter()) # 输出:20
print(rect) # 输出:Rectangle(Length: 4, Width: 6)
# 创建一个正方形实例
square = Square(5)
print(square.perimeter()) # 输出:20
print(square)
声明一个基类Shape(形状),其中包含一个方法来计算面积; 从Shape 派生两个类:Rectangle(矩形类)和Circle(圆形类); 从Rectangle 类派生正方形类Square; 分别实现派生类构造函数、析构函数及其它功能的成员函数; 创建各派生类的对象,观察构造函数、析构函数的调用次序; 计算不同对象的面积。
好的,这是一个经典的面向对象编程的例子,我来逐步解释一下。
首先,我们声明一个基类Shape,其中包含一个方法来计算面积:
```C++
class Shape {
public:
virtual double getArea() const = 0; // 纯虚函数,计算面积
virtual ~Shape() {} // 虚析构函数,确保子类析构时也会被调用
};
```
这里使用了纯虚函数来定义计算面积的功能,因为不同的形状计算面积的方法是不同的,我们需要在子类中实现这个方法。
接下来,我们从Shape派生两个类:Rectangle和Circle:
```C++
class Rectangle : public Shape {
public:
Rectangle(double w, double h) : width(w), height(h) {}
double getArea() const override { return width * height; }
private:
double width, height;
};
class Circle : public Shape {
public:
Circle(double r) : radius(r) {}
double getArea() const override { return 3.14159 * radius * radius; }
private:
double radius;
};
```
这里使用了override关键字来覆盖基类的虚函数,确保在子类中实现了正确的功能。Rectangle和Circle分别实现了自己的计算面积的方法,也定义了自己的构造函数。
接下来,我们从Rectangle派生正方形类Square:
```C++
class Square : public Rectangle {
public:
Square(double s) : Rectangle(s, s) {}
};
```
注意到正方形是矩形的一种特殊情况,因此我们可以从Rectangle派生Square,然后在构造函数中将正方形的宽和高都设置为边长s。
最后,我们可以创建各派生类的对象,观察构造函数、析构函数的调用次序,以及计算不同对象的面积:
```C++
int main() {
Shape* s1 = new Rectangle(2, 3);
Shape* s2 = new Circle(1.5);
Shape* s3 = new Square(2);
cout << "Area of rectangle: " << s1->getArea() << endl;
cout << "Area of circle: " << s2->getArea() << endl;
cout << "Area of square: " << s3->getArea() << endl;
delete s1;
delete s2;
delete s3;
return 0;
}
```
这里使用了指针来创建对象,并使用虚析构函数确保子类析构时也会被调用。我们可以观察到构造函数的调用顺序是Shape -> Rectangle -> Square/Circle,析构函数的调用顺序是Square/Circle -> Rectangle -> Shape,即与构造函数相反的顺序。
最后,我们计算了不同对象的面积,并输出了结果。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)