你列出的这些属于 C++ 高级开发中面向对象设计与架构设计的核心知识,也是面试高级工程师岗位必问的内容。下面我按顺序,深入讲解每一项概念、原理、用途,并穿插 C++ 示例。
✅ 1. 设计原则(SOLID)
SOLID 是面向对象设计的五大原则,有助于写出可维护、可扩展、低耦合、高内聚的代码。
缩写 | 名称 | 含义 |
---|---|---|
S | 单一职责原则 (SRP) | 每个类只有一个引起它变化的原因。 |
O | 开闭原则 (OCP) | 对扩展开放,对修改关闭。 |
L | 里氏替换原则 (LSP) | 子类应能替代父类并正确运行。 |
I | 接口隔离原则 (ISP) | 不应强迫客户端依赖不使用的接口。 |
D | 依赖倒置原则 (DIP) | 高层模块不应依赖底层模块,二者都依赖抽象。 |
示例(开闭原则):
class Shape {
public:virtual double area() const = 0;virtual ~Shape() = default;
};class Circle : public Shape {double r;
public:Circle(double r) : r(r) {}double area() const override { return 3.14 * r * r; }
};class Square : public Shape {double s;
public:Square(double s) : s(s) {}double area() const override { return s * s; }
};// 对扩展开放,对修改关闭
double totalArea(const std::vector<std::shared_ptr<Shape>>& shapes) {double sum = 0;for (auto& s : shapes) {sum += s->area(); // 多态支持}return sum;
}
✅ 2. 设计模式(单例、工厂、观察者、策略、模板方法等)
常见设计模式:
模式 | 用途 |
---|---|
单例模式 | 系统中只允许一个类的实例存在。 |
工厂模式 | 将对象创建的逻辑封装起来,解耦使用者与实现。 |
观察者模式 | 一对多通知机制,发布-订阅。 |
策略模式 | 封装行为,动态选择策略实现。 |
模板方法模式 | 父类定义流程,子类实现具体步骤。 |
单例模式(懒汉线程安全)
class Singleton {
private:Singleton() {}
public:static Singleton& getInstance() {static Singleton instance;return instance;}void doSomething() {}
};
✅ 3. 虚函数、多态、纯虚函数与接口设计
- 虚函数:允许子类重写,支持运行时多态。
- 纯虚函数:用
= 0
表示,是接口设计的核心。 - 接口类:只包含纯虚函数,无成员变量。
示例:
class IShape {
public:virtual double area() const = 0; // 纯虚函数virtual ~IShape() = default;
};class Rectangle : public IShape {double w, h;
public:Rectangle(double w, double h) : w(w), h(h) {}double area() const override { return w * h; }
};
✅ 4. 多继承与虚继承
- 多继承:一个类继承多个基类,容易造成二义性。
- 虚继承:解决“菱形继承”中基类重复问题。
示例(虚继承):
class A {
public:int x;
};class B : virtual public A {};
class C : virtual public A {};class D : public B, public C {
public:void setX(int val) { x = val; } // x不再重复
};
✅ 5. 对象生命周期管理
C++ 对象生命周期分为:
- 静态对象:程序开始时分配,结束时销毁(如全局变量)。
- 自动对象:函数栈帧上的局部变量,函数结束时自动销毁。
- 动态对象:通过
new
分配,必须手动或用智能指针释放。 - 临时对象:表达式中创建,使用后自动销毁。
要点:
- 避免使用裸
new
/delete
- 配合 RAII 和智能指针自动管理资源
✅ 6. RAII(资源获取即初始化)
RAII 是 C++ 的重要资源管理机制,通过对象构造/析构自动管理资源(如文件、锁、内存)。
示例(文件RAII封装):
class FileWrapper {FILE* fp;
public:FileWrapper(const char* filename, const char* mode) {fp = fopen(filename, mode);if (!fp) throw std::runtime_error("打开文件失败");}~FileWrapper() {if (fp) fclose(fp);}FILE* get() { return fp; }
};
总结
技术点 | 关键词 | 作用 |
---|---|---|
SOLID 原则 | SRP, OCP, LSP, ISP, DIP | 提升代码可维护性、可扩展性 |
设计模式 | 单例、工厂、观察者等 | 应对常见场景的架构模式 |
多态 | 虚函数、纯虚函数 | 提供接口抽象与多态行为 |
多继承 | 虚继承 | 解决菱形继承的问题 |
生命周期 | 栈、堆、临时对象 | 资源正确创建与释放 |
RAII | 构造申请,析构释放 | 避免资源泄露,异常安全 |