MST

星途 面试题库

面试题:C++中抽象类派生类的虚函数重写

假设有一个抽象类`Shape`,包含纯虚函数`draw()`。请编写一个派生类`Circle`继承自`Shape`,实现`draw()`函数来绘制一个简单的圆形(在控制台输出表示圆形的图案即可)。并解释为什么派生类必须重写抽象类中的纯虚函数。
13.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <cmath>

// 抽象类Shape
class Shape {
public:
    // 纯虚函数draw
    virtual void draw() = 0;
};

// 派生类Circle继承自Shape
class Circle : public Shape {
public:
    // 重写draw函数
    void draw() override {
        const int radius = 5;
        for (int y = -radius; y <= radius; ++y) {
            for (int x = -radius; x <= radius; ++x) {
                if (std::sqrt(x * x + y * y) <= radius + 0.5) {
                    std::cout << "* ";
                } else {
                    std::cout << "  ";
                }
            }
            std::cout << std::endl;
        }
    }
};

派生类必须重写抽象类中的纯虚函数,原因如下:

抽象类存在的意义是为了定义一种通用的接口规范,它包含了纯虚函数,这些纯虚函数没有具体实现。抽象类不能被实例化,其目的是作为基类,让派生类去继承并根据自身的特性来实现这些纯虚函数。如果派生类不重写抽象类中的纯虚函数,那么这个派生类也会成为抽象类,同样不能被实例化。只有当派生类重写了所有的纯虚函数,它才能够被实例化,从而实现具体的功能。在这个例子中,Shape类定义了draw函数的接口,但没有实现具体如何绘制,不同的形状(如圆形、矩形等)有不同的绘制方式,所以Circle类继承Shape类后,必须重写draw函数,以实现圆形的绘制逻辑。这样,通过Shape类的接口,我们可以以多态的方式调用不同派生类(如CircleRectangle等)的draw函数,实现不同形状的绘制。