面试题答案
一键面试一、使用组合替代继承
- 原理:组合是将一个对象嵌入到另一个对象中,通过调用嵌入对象的方法来实现功能。这样避免了继承带来的紧密耦合以及虚函数表等开销。
- 示例代码:
class Engine {
public:
void start() {
std::cout << "Engine started" << std::endl;
}
void stop() {
std::cout << "Engine stopped" << std::endl;
}
};
class Car {
private:
Engine engine;
public:
void startCar() {
engine.start();
}
void stopCar() {
engine.stop();
}
};
二、使用策略模式优化行为复用
- 原理:策略模式定义一系列算法,将每个算法封装起来,使它们可以相互替换。这样避免了在继承体系中大量虚函数的使用,通过组合方式实现行为的复用。
- 示例代码:
class SortStrategy {
public:
virtual void sort(int* arr, int size) = 0;
virtual ~SortStrategy() {}
};
class QuickSort : public SortStrategy {
public:
void sort(int* arr, int size) override {
// 快速排序实现
}
};
class MergeSort : public SortStrategy {
public:
void sort(int* arr, int size) override {
// 归并排序实现
}
};
class Sorter {
private:
SortStrategy* strategy;
public:
Sorter(SortStrategy* strat) : strategy(strat) {}
void performSort(int* arr, int size) {
strategy->sort(arr, size);
}
~Sorter() {
delete strategy;
}
};
三、使用模板元编程优化编译期代码生成
- 原理:模板元编程允许在编译期进行计算和代码生成,减少运行时开销。可以通过模板特化等方式针对不同类型或条件生成不同的代码。
- 示例代码:
template <typename T>
class MathOperations {
public:
static T add(T a, T b) {
return a + b;
}
};
template <>
class MathOperations<bool> {
public:
static bool add(bool a, bool b) {
return a || b;
}
};
四、减少不必要的虚函数
- 策略:仅在确实需要多态行为时使用虚函数。如果一个函数在继承体系中不会被重写,就不要声明为虚函数。
- 示例:
class Base {
public:
void nonVirtualFunction() {
// 具体实现,不会被重写
}
virtual void virtualFunction() {
// 可能被重写的实现
}
};
五、优化对象布局
- 策略:使用
#pragma pack
等方式控制结构体和类的对齐方式,减少因对齐带来的空间浪费。另外,将常用成员变量放在前面,以提高缓存命中率。 - 示例:
#pragma pack(push, 1)
struct SmallStruct {
char a;
int b;
};
#pragma pack(pop)
通过上述设计模式和优化策略,可以在大型C++项目中确保代码复用的高效性,同时避免继承带来的不必要开销。