面试题答案
一键面试多态实现代码可扩展性与可替换性的分析
- 多态的基础:在C++ 中,通过基类指针或引用指向派生类对象来实现多态。基类中定义虚函数,派生类重写这些虚函数。例如:
class Shape {
public:
virtual void draw() const = 0;
};
class Circle : public Shape {
public:
void draw() const override {
std::cout << "Drawing a circle" << std::endl;
}
};
class Rectangle : public Shape {
public:
void draw() const override {
std::cout << "Drawing a rectangle" << std::endl;
}
};
- 可扩展性:当添加新功能(如新的派生类)时,只需创建新的派生类并重写基类的虚函数。例如添加一个
Triangle
类:
class Triangle : public Shape {
public:
void draw() const override {
std::cout << "Drawing a triangle" << std::endl;
}
};
这样,在使用Shape
指针或引用的地方,无需修改已有代码,就可以处理新的Triangle
对象,实现了代码的可扩展性。
3. 可替换性:如果要替换现有实现,比如修改Circle
的绘制方式,只需修改Circle
类中draw
函数的实现,而使用Shape
指针或引用的其他部分代码不受影响。因为调用函数是基于运行时对象的实际类型,而不是指针或引用的静态类型。
策略模式中多态的关键作用
- 策略模式定义:策略模式定义了一系列算法,将每个算法封装起来,使它们可以相互替换。
- 策略模式实现:以一个计算不同图形面积的场景为例。
class AreaCalculator {
public:
virtual double calculateArea() const = 0;
};
class CircleAreaCalculator : public AreaCalculator {
private:
double radius;
public:
CircleAreaCalculator(double r) : radius(r) {}
double calculateArea() const override {
return 3.14159 * radius * radius;
}
};
class RectangleAreaCalculator : public AreaCalculator {
private:
double width;
double height;
public:
RectangleAreaCalculator(double w, double h) : width(w), height(h) {}
double calculateArea() const override {
return width * height;
}
};
class Shape {
private:
AreaCalculator* areaCalculator;
public:
Shape(AreaCalculator* calculator) : areaCalculator(calculator) {}
double calculateArea() const {
return areaCalculator->calculateArea();
}
~Shape() {
delete areaCalculator;
}
};
- 多态的作用:在策略模式中,多态使得不同的算法(如不同图形的面积计算)可以方便地替换。如果要添加新的图形面积计算方式,如三角形面积计算,只需创建新的
TriangleAreaCalculator
派生类并实现calculateArea
函数。然后可以轻松地将其应用到Shape
类中,无需修改Shape
类的其他代码,实现了可扩展性和可替换性。同时,Shape
类中通过AreaCalculator
指针调用calculateArea
函数,利用多态根据实际的派生类对象调用相应的面积计算方法,而不影响其他使用Shape
类的代码部分。