CPP学习
666
class Shape
{
public:
virtual double area() = 0; //纯虚函数 , 与一般虚函数的区别是,纯虚函数没有函数体,只是一个接口,由派生类去实现
protected:
double area_; //面积
};
class Point : virtual public Shape {
private:
double x, y;
public:
Point() = default;
Point(double x, double y) : x(x), y(y) {}
void setPoint(double x, double y) {
this->x = x;
this->y = y;
}
double getX() const { //const成员函数,不改变对象的值,
return x;
}
[[nodiscard]] double getY() const { //[[nodiscard]]是一个 C++17 的属性,它用于指示编译器在调用函数时必须使用其返回值。
return y;
}
//using Shape::area; // 使用 Shape 中的 area() 实现
double area() override { //重写基类的虚函数,实现多态
return 0;
}
};
//基类圆类
class CircleBase : virtual public Shape {
protected:
double r;
public:
CircleBase() = default;
CircleBase(double r) : r(r) {}
void setRadius(double r) {
this->r = r;
}
//重写基类的虚函数,实现多态
//using Shape::area; // 使用 Shape 中的 area() 实现
double area() override {
return 3.14 * r * r;
}
double getLength() const {
return 2 * 3.14 * r;
}
};
//派生圆类,基于点类
class Circle : public CircleBase, public Point {
public:
using CircleBase::area; // 使用 CircleBase 中的 area() 实现
double area() override {
return CircleBase::area();
}
Circle() = default;
Circle(double x, double y, double r) : CircleBase(r), Point(x, y) {}
bool contain(const Point &p) const {
double dis = sqrt(pow(getX() - p.getX(), 2) + pow(getY() - p.getY(), 2));
return dis <= r;
}
};
//复合圆类Circle2,基于点类
class Circle2 : public CircleBase {
private:
Point center;
public:
Circle2() = default;
Circle2(double x, double y, double r) : CircleBase(r), center(x, y) {}
void setCenter(double x, double y) {
center.setPoint(x, y);
}
bool contain(const Point &p) const {
double dis = sqrt(pow(center.getX() - p.getX(), 2) + pow(center.getY() - p.getY(), 2));
return dis <= r;
}
};
int main() {
int t;
cin >> t;
while (t--) {
double x, y, r;
cin >> x >> y >> r;
Circle c(x, y, r);
cin >> x >> y >> r;
Circle2 c2(x, y, r);
cin >> x >> y;
Point p(x, y); //
cout << fixed << setprecision(2) << c.area() << " " << c.getLength() << " " << (c.contain(p) ? "Yes" : "No") << endl;
cout << fixed << setprecision(2) << c2.area() << " " << c2.getLength() << " " << (c2.contain(p) ? "Yes" : "No") << endl;
}
return 0;
}
这段代码实现了几个类,它们之间有继承关系和多态性:
- Shape类是一个抽象类,定义了一个纯虚函数area(),它是一个接口,由派生类去实现。
- Point类继承自Shape类,表示一个二维平面上的点,它重写了Shape类的虚函数area(),实现了多态性。
- CircleBase类继承自Shape类,表示一个圆形的基类,其中包含圆的半径属性和计算面积的函数area(),同样也实现了多态性。
- Circle类继承自CircleBase类和Point类,它重写了CircleBase类的虚函数area(),并使用using语句将CircleBase类中的area()函数引入到它的作用域中,以实现多态性。同时,它还包含一个contain()函数用于判断一个点是否在圆内。
- Circle2类继承自CircleBase类,它包含一个Point类的对象,表示一个圆的中心点,同样包含一个contain()函数用于判断一个点是否在圆内。
这段代码涉及到了面向对象程序设计中的一些知识点,包括:
- 抽象类和接口:Shape类是一个抽象类,它定义了一个纯虚函数area()作为接口,由派生类去实现。
- 多态性:Point类和CircleBase类都重写了Shape类的虚函数area(),并实现了多态性。Circle类使用using语句将CircleBase类中的area()函数引入到它的作用域中,以实现多态性。
- 继承和派生:Circle类和Circle2类都继承自CircleBase类,它们都是圆形的类,但是它们的实现方式不同。Circle类使用Point类实现圆心,而Circle2类包含一个Point类的对象表示圆心。
- 成员函数和const关键字:类中的成员函数可以通过const关键字声明为不改变对象的值,例如Point类中的getX()和getY()函数。
没做评论