面试题答案
一键面试1. 函数重载
函数重载是指在同一作用域内,可以有多个同名函数,但这些函数的参数列表(参数个数、类型或顺序)不同。在图形绘制框架中,函数重载可以用于处理不同类型图形的绘制。
// 简单的图形基类
class Shape {
public:
virtual ~Shape() = default;
};
// 圆形类
class Circle : public Shape {
public:
Circle(float radius) : radius(radius) {}
float radius;
};
// 矩形类
class Rectangle : public Shape {
public:
Rectangle(float width, float height) : width(width), height(height) {}
float width;
float height;
};
// 函数重载:绘制圆形
void draw(const Circle& circle) {
std::cout << "Drawing a circle with radius " << circle.radius << std::endl;
}
// 函数重载:绘制矩形
void draw(const Rectangle& rectangle) {
std::cout << "Drawing a rectangle with width " << rectangle.width << " and height " << rectangle.height << std::endl;
}
2. 虚函数
虚函数用于实现运行时多态。通过在基类中定义虚函数,并在派生类中重写这些函数,可以根据对象的实际类型来调用正确的函数。
class Shape {
public:
virtual void draw() const = 0;
virtual ~Shape() = default;
};
class Circle : public Shape {
public:
Circle(float radius) : radius(radius) {}
void draw() const override {
std::cout << "Drawing a circle with radius " << radius << std::endl;
}
float radius;
};
class Rectangle : public Shape {
public:
Rectangle(float width, float height) : width(width), height(height) {}
void draw() const override {
std::cout << "Drawing a rectangle with width " << width << " and height " << height << std::endl;
}
float width;
float height;
};
// 使用虚函数进行绘制
void drawShapes(const std::vector<std::unique_ptr<Shape>>& shapes) {
for (const auto& shape : shapes) {
shape->draw();
}
}
3. 模板元编程
模板元编程(TMP)是一种在编译期进行计算的技术,可以用来生成高效的代码,减少运行时开销。在图形绘制框架中,可以使用模板元编程来优化特定类型图形的绘制。
// 模板元编程示例:根据图形类型选择优化的绘制算法
template <typename ShapeType>
struct ShapeDrawer {
static void draw(const ShapeType& shape) {
// 通用绘制逻辑
std::cout << "Default drawing for shape" << std::endl;
}
};
template <>
struct ShapeDrawer<Circle> {
static void draw(const Circle& circle) {
// 优化的圆形绘制逻辑
std::cout << "Optimized drawing for circle with radius " << circle.radius << std::endl;
}
};
template <>
struct ShapeDrawer<Rectangle> {
static void draw(const Rectangle& rectangle) {
// 优化的矩形绘制逻辑
std::cout << "Optimized drawing for rectangle with width " << rectangle.width << " and height " << rectangle.height << std::endl;
}
};
// 使用模板元编程进行绘制
template <typename ShapeType>
void drawOptimized(const ShapeType& shape) {
ShapeDrawer<ShapeType>::draw(shape);
}
4. 结合三者实现图形绘制框架
通过结合函数重载、虚函数和模板元编程,可以实现一个高度灵活和高效的图形绘制框架。
// 基类及派生类定义不变
// 结合函数重载与虚函数
void draw(const Shape& shape) {
shape.draw();
}
// 结合模板元编程
template <typename ShapeType>
void drawOptimized(const ShapeType& shape) {
ShapeDrawer<ShapeType>::draw(shape);
}
int main() {
std::vector<std::unique_ptr<Shape>> shapes;
shapes.emplace_back(std::make_unique<Circle>(5.0f));
shapes.emplace_back(std::make_unique<Rectangle>(4.0f, 3.0f));
// 使用虚函数绘制
drawShapes(shapes);
// 使用函数重载绘制
Circle circle(6.0f);
Rectangle rectangle(5.0f, 4.0f);
draw(circle);
draw(rectangle);
// 使用模板元编程优化绘制
drawOptimized(circle);
drawOptimized(rectangle);
return 0;
}
这样,通过函数重载处理不同类型图形的绘制,虚函数实现运行时多态,模板元编程优化特定类型图形的绘制,实现了一个既灵活又高效的图形绘制框架,兼顾了代码的可扩展性和性能优化。