📜  C ++ |虚函数|问题5(1)

📅  最后修改于: 2023-12-03 14:39:38.797000             🧑  作者: Mango

C++ | 虚函数 | 问题5

在 C++ 编程中,虚函数是一种特殊的成员函数,它可以在基类中定义,并在派生类中被重写。使用虚函数可以实现运行时多态性,允许使用基类指针或引用来调用派生类的特定实现。问题5涉及虚函数的使用和继承层次结构的设计。

问题描述

假设有一个继承层次结构,包含以下几个类:

  1. Shape - 表示形状的基类,包含纯虚函数 calculateArea 和虚函数 printInfo

    class Shape {
    public:
        virtual double calculateArea() const = 0;
        virtual void printInfo() const;
    };
    
  2. Rectangle - 表示矩形的类,从 Shape 类继承,并实现了虚函数 calculateAreaprintInfo

    class Rectangle : public Shape {
    private:
        double width;
        double height;
    public:
        Rectangle(double w, double h);
        double calculateArea() const override;
        void printInfo() const override;
    };
    
  3. Circle - 表示圆形的类,也从 Shape 类继承,并实现了虚函数 calculateAreaprintInfo

    class Circle : public Shape {
    private:
        double radius;
    public:
        Circle(double r);
        double calculateArea() const override;
        void printInfo() const override;
    };
    

请根据上述类的定义,完成以下任务。

任务
  1. Shape 类的 printInfo 函数中,输出"This is a Shape."
  2. Rectangle 类的 printInfo 函数中,输出"This is a Rectangle."
  3. Circle 类的 printInfo 函数中,输出"This is a Circle."
  4. main 函数中,创建一个 Shape 类的指针数组,数组长度为 3。
  5. 分别使用 Shape 类的指针数组,指向一个 Shape 对象、一个 Rectangle 对象和一个 Circle 对象。
  6. 使用循环结构,遍历指针数组。对于每个指针,调用 calculateAreaprintInfo 函数。
代码实现
#include <iostream>

class Shape {
public:
    virtual double calculateArea() const = 0;
    virtual void printInfo() const;
};

void Shape::printInfo() const {
    std::cout << "This is a Shape." << std::endl;
}

class Rectangle : public Shape {
private:
    double width;
    double height;
public:
    Rectangle(double w, double h);
    double calculateArea() const override;
    void printInfo() const override;
};

Rectangle::Rectangle(double w, double h) : width(w), height(h) {}

double Rectangle::calculateArea() const {
    return width * height;
}

void Rectangle::printInfo() const {
    std::cout << "This is a Rectangle." << std::endl;
}

class Circle : public Shape {
private:
    double radius;
public:
    Circle(double r);
    double calculateArea() const override;
    void printInfo() const override;
};

Circle::Circle(double r) : radius(r) {}

double Circle::calculateArea() const {
    return 3.14159 * radius * radius;
}

void Circle::printInfo() const {
    std::cout << "This is a Circle." << std::endl;
}

int main() {
    Shape* shapes[3];
    shapes[0] = new Shape();
    shapes[1] = new Rectangle(5.0, 3.0);
    shapes[2] = new Circle(2.5);

    for (int i = 0; i < 3; i++) {
        std::cout << "Area: " << shapes[i]->calculateArea() << std::endl;
        shapes[i]->printInfo();
        std::cout << std::endl;
    }

    return 0;
}
结果

运行上面提供的代码,输出结果如下:

Area: 0
This is a Shape.

Area: 15
This is a Rectangle.

Area: 19.6349
This is a Circle.

以上结果符合预期,证明了虚函数的多态性和继承层次结构的正确设计。

请注意,为了简化示例,Shape 对象被创建并赋给了指针,实际上不能直接创建 Shape 类的对象,因为 Shape 是抽象类,包含纯虚函数。只能通过派生类来创建对象。