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;
}


这段代码实现了几个类,它们之间有继承关系和多态性:

  1. Shape类是一个抽象类,定义了一个纯虚函数area(),它是一个接口,由派生类去实现。
  2. Point类继承自Shape类,表示一个二维平面上的点,它重写了Shape类的虚函数area(),实现了多态性。
  3. CircleBase类继承自Shape类,表示一个圆形的基类,其中包含圆的半径属性和计算面积的函数area(),同样也实现了多态性。
  4. Circle类继承自CircleBase类和Point类,它重写了CircleBase类的虚函数area(),并使用using语句将CircleBase类中的area()函数引入到它的作用域中,以实现多态性。同时,它还包含一个contain()函数用于判断一个点是否在圆内。
  5. Circle2类继承自CircleBase类,它包含一个Point类的对象,表示一个圆的中心点,同样包含一个contain()函数用于判断一个点是否在圆内。

这段代码涉及到了面向对象程序设计中的一些知识点,包括:

  1. 抽象类和接口:Shape类是一个抽象类,它定义了一个纯虚函数area()作为接口,由派生类去实现。
  2. 多态性:Point类和CircleBase类都重写了Shape类的虚函数area(),并实现了多态性。Circle类使用using语句将CircleBase类中的area()函数引入到它的作用域中,以实现多态性。
  3. 继承和派生:Circle类和Circle2类都继承自CircleBase类,它们都是圆形的类,但是它们的实现方式不同。Circle类使用Point类实现圆心,而Circle2类包含一个Point类的对象表示圆心。
  4. 成员函数和const关键字:类中的成员函数可以通过const关键字声明为不改变对象的值,例如Point类中的getX()和getY()函数。

没做评论