1. 类与类关系概述
在面向对象编程中,类与类之间的关系是构建复杂系统的基石。理解这些关系不仅能帮助我们设计出更合理的代码结构,还能让系统具备更好的扩展性和维护性。在C++中,类关系主要通过继承、关联、聚合、组合和依赖五种形式来体现。
每种关系都有其特定的语义和适用场景。比如继承体现了"is-a"关系,组合体现了"has-a"关系,而依赖则是一种临时性的使用关系。这些关系在UML图中都有对应的表示方法,理解这些图形符号对于阅读和绘制设计图至关重要。
提示:在实际项目中,正确识别和使用类关系可以避免很多设计问题。我见过不少项目因为滥用继承而导致类层次过深,最终难以维护。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 继承关系详解
2.1 继承的基本概念
继承是面向对象最核心的特性之一,它允许子类获取父类的属性和方法。在UML中,继承用带空心三角形的实线表示,三角形指向父类。C++中使用冒号(:)表示继承关系:
cpp复制class SubClass : public SuperClass {
// 类定义
};
继承关系中的术语需要注意:
- 父类:也称为基类或超类(Superclass)
- 子类:也称为派生类(Subclass)
- 泛化(Generalization):即继承关系的另一种说法
2.2 虚函数与多态
虚函数是实现运行时多态的关键。在父类中将函数声明为virtual,子类可以通过override关键字重写这些函数:
cpp复制class Shape {
public:
virtual void draw() = 0; // 纯虚函数
virtual ~Shape() {} // 虚析构函数
};
class Circle : public Shape {
public:
void draw() override {
cout << "Drawing a circle" << endl;
}
};
注意:如果一个类包含纯虚函数(=0),那么这个类就是抽象类,不能直接实例化。
2.3 继承的访问控制
C++中有三种继承方式:
- public继承:父类的public成员在子类中保持public,protected保持protected
- p
