构造一个抽象类shape,封装两个纯需函数分别计算图形的面积和周长,由此派生出长方形类,进而派生出正方形类,要求给出具体的面积和周长的计算函数。给出测试程序,能够体现出虚函数、函数重载和覆盖继承的各自
时间: 2023-04-18 09:03:22 浏览: 166
特点。
抽象类shape的定义如下:
```c++
class shape {
public:
virtual double area() = ; // 纯虚函数,计算面积
virtual double perimeter() = ; // 纯虚函数,计算周长
};
```
长方形类rectangle的定义如下:
```c++
class rectangle : public shape {
public:
rectangle(double w, double h) : width(w), height(h) {}
double area() override { return width * height; } // 计算面积
double perimeter() override { return 2 * (width + height); } // 计算周长
private:
double width, height;
};
```
正方形类square的定义如下:
```c++
class square : public rectangle {
public:
square(double s) : rectangle(s, s) {}
};
```
测试程序如下:
```c++
int main() {
rectangle r(3, 4);
square s(5);
shape* p1 = &r;
shape* p2 = &s;
cout << "rectangle area: " << p1->area() << endl; // 输出:rectangle area: 12
cout << "rectangle perimeter: " << p1->perimeter() << endl; // 输出:rectangle perimeter: 14
cout << "square area: " << p2->area() << endl; // 输出:square area: 25
cout << "square perimeter: " << p2->perimeter() << endl; // 输出:square perimeter: 20
return ;
}
```
可以看到,通过虚函数和覆盖继承,我们可以在基类中定义通用的接口,然后在派生类中实现具体的功能。同时,由于面积和周长的计算方式不同,我们在派生类中对基类的纯虚函数进行了重载。
阅读全文