面试题答案
一键面试实际应用场景
- 创建通用接口:当需要定义一组相关类的通用操作接口,但具体实现因类而异时,可在抽象类中使用纯虚函数。例如在图形绘制系统中,不同图形(如圆形、矩形、三角形)都有绘制操作,但绘制方式不同。
- 模板方法模式:在设计模式中,抽象类定义算法的框架,通过纯虚函数让子类实现特定步骤。比如文件处理流程,抽象类定义打开、读取、处理、关闭文件的框架,子类根据文件类型(如文本文件、二进制文件)实现具体读取和处理操作。
- 强制子类实现特定行为:确保继承该抽象类的所有子类都实现某些关键功能,否则编译不通过。如游戏角色类,所有角色都必须有移动和攻击行为,在抽象角色类中定义为纯虚函数,子类具体角色(战士、法师等)实现这些行为。
示例代码
#include <iostream>
// 抽象图形类
class Shape {
public:
// 纯虚函数,用于绘制图形
virtual void draw() const = 0;
};
// 圆形类,继承自Shape
class Circle : public Shape {
public:
void draw() const override {
std::cout << "绘制圆形" << std::endl;
}
};
// 矩形类,继承自Shape
class Rectangle : public Shape {
public:
void draw() const override {
std::cout << "绘制矩形" << std::endl;
}
};
int main() {
// 不能直接创建抽象类Shape的对象
// Shape s; // 这会导致编译错误
// 创建具体图形对象
Circle c;
Rectangle r;
// 通过基类指针调用draw函数,实现多态
Shape* shapes[2] = {&c, &r};
for (int i = 0; i < 2; ++i) {
shapes[i]->draw();
}
return 0;
}
在上述代码中,Shape
类是抽象类,其中draw
函数为纯虚函数。Circle
和Rectangle
类继承自Shape
并实现了draw
函数,通过Shape
类指针调用draw
函数展示了多态性。