面试题答案
一键面试#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
类的接口,我们可以以多态的方式调用不同派生类(如Circle
、Rectangle
等)的draw
函数,实现不同形状的绘制。