C++ Shape 类:抽象图形类、矩形和圆形的面积和周长计算
C++ Shape 类:抽象图形类、矩形和圆形的面积和周长计算
本代码示例展示了如何使用 C++ 抽象类 Shape 定义面积和周长计算,并通过派生类 Rectangle 和 Circle 计算矩形和圆形的面积和周长。代码还解释了使用基类指针调用派生类方法的原理。
代码示例
//Shape.h
#pragma once
/*定义一个抽象图形类Shape,定义纯虚函数area()和perim()用以计算面积和周长。
从Shape派生出矩形(Rectangle)、圆形(Circle)具体派生类。
程序中通过基类指针(//纯虚析构)来调用派生类对象中的重写的纯虚函数
计算不同形状对象的面积和周长。*/
//抽象图形类
class Shape
{
public:
virtual double area(void) = 0;
virtual double perim(void) = 0;
};
// Rectangle.h
#pragma once
#include 'Shape.h'
/*定义一个抽象图形类Shape,定义纯虚函数area()和perim()用以计算面积和周长。
从Shape派生出矩形(Rectangle)、圆形(Circle)具体派生类。
程序中通过基类指针(//纯虚析构)来调用派生类对象中的重写的纯虚函数
计算不同形状对象的面积和周长。*/
class Rectangle :public Shape
{
private:
double length; //矩形的长
double width; //矩形的宽
public:
Rectangle(double length, double width){
this->length = length;
this->width = width;
}
virtual double area(void) {
return length * width;
}
virtual double perim(void) {
return 2 * (length + width);
}
};
//circle.h
#pragma once
#include 'Shape.h'
class Circle:public Shape
{
private:
double radious;
public:
Circle(double radious) {
this->radious = radious;
}
virtual double area() {
return 3.14 * radious * radious;
}
virtual double perim() {
return 3.14 * 2 * radious;
}
};
//Main.cpp
#include <iostream>
#include 'Shape.h'
#include 'Rectangle.h'
#include 'Circle.h' //添加Circle.h头文件
using namespace std;
int main()
{
int length = 2, wide = 5;
Shape* ob=new Rectangle(length,wide); //修改创建Rectangle对象的方式
cout << ob->area();
cout << ob->perim() << endl;
double radious=1;
Shape* ob2 = new Circle(radious);
cout << ob2->area() << endl;
cout << ob2->perim() << endl;
}
代码解释
-
抽象类
Shape:- 定义了两个纯虚函数
area()和perim(),分别用于计算形状的面积和周长。 - 由于是纯虚函数,
Shape类不能实例化,只能作为基类被派生类继承。
- 定义了两个纯虚函数
-
派生类
Rectangle和Circle:- 继承自
Shape类,并重写了area()和perim()函数,实现了矩形和圆形的面积和周长计算。
- 继承自
-
基类指针调用派生类方法:
- 在
main函数中,使用Shape指针分别指向Rectangle和Circle对象。 - 通过
ob->area()和ob->perim()调用派生类对象中重写的纯虚函数,实现了动态多态性。
- 在
VS2022 错误解决
在 VS2022 中,Shape* ob2 = new Circle(radious) 报错是因为 main.cpp 中没有包含 Circle.h 头文件。
解决方法:在 main.cpp 中添加 #include 'Circle.h',使编译器能够识别 Circle 类。
总结
本代码示例展示了如何使用 C++ 抽象类和继承来实现不同形状的面积和周长计算,以及基类指针调用派生类方法的原理。同时,代码还解释了常见的编译错误并给出了解决方法。
原文地址: https://www.cveoy.top/t/topic/nplf 著作权归作者所有。请勿转载和采集!