- 继承性的概念
- 继承是面向对象编程(OOP)中的一个重要概念。它允许创建一个新的类(称为派生类或子类),这个新类从一个已存在的类(称为基类或父类)那里继承属性(数据成员)和行为(成员函数)。简单来说,子类可以复用父类的代码,并且可以在父类的基础上进行扩展。
- 例如,我们有一个 "动物" 基类,它有属性 "年龄" 和行为 "吃"。然后我们创建一个 "狗" 子类,"狗" 类可以继承 "动物" 类的 "年龄" 属性和 "吃" 行为,同时还可以添加自己特有的属性,如 "品种" 和行为,如 "汪汪叫"。
- C++ 中实现继承的方式
- 语法格式为:class 派生类名: 继承方式 基类名。
- 其中继承方式主要有三种:public(公有继承)、private(私有继承)和protected(保护继承)。
- 公有继承示例
- 假设有一个基类Shape,代码如下:
class Shape {
public:
void setWidth(int w) {
width = w;
}
void setHeight(int h) {
height = h;
}
protected:
int width;
int height;
};
- 然后我们创建一个派生类Rectangle来公有继承Shape:
class Rectangle : public Shape {
public:
int getArea() {
return width * height;
}
};
- 在这个例子中,Rectangle类通过public继承了Shape类。Rectangle类可以访问Shape类中的public成员函数setWidth和setHeight,也可以访问protected成员变量width和height。并且在Rectangle类外部,Shape类的public成员仍然是public的,这符合公有继承的规则。
- 继承的好处
- 代码复用
- 减少了代码的重复编写。例如,如果有多个类都具有相同的基本属性和行为,如各种几何图形(三角形、矩形等)都有计算面积和周长的行为,都有边长等属性。可以先创建一个基类包含这些共有的属性和行为,然后让各个具体的几何图形类继承这个基类,这样就避免了在每个类中都重复编写相同的代码。
- 层次化设计和建模
- 能够更好地对现实世界中的对象关系进行建模。以交通工具为例,汽车、火车、飞机等都可以看作是 "交通工具" 这个基类的派生类。这种层次结构可以清晰地反映出对象之间的关系,便于理解和维护代码。在设计软件系统时,也可以按照这种层次关系来组织类,使得系统结构更加清晰。
- 可扩展性
- 方便对软件进行扩展。当需要添加新的功能或者新的类时,只要在继承体系中适当的位置添加新的派生类或者在已有派生类中添加新的成员函数即可。例如,在图形绘制系统中,如果要添加一种新的图形,如菱形,只需要创建一个新的类从图形基类继承,并添加菱形特有的属性和行为即可。
- 代码复用
- 继承的注意事项
- 继承关系的合理性
- 要确保继承关系在语义上是合理的。不能仅仅为了复用代码而创建不合理的继承关系。例如,不能让 "汽车" 类继承 "鸟类" 类,因为它们在概念上没有继承关系。应该根据对象之间真实的 "is - a"(是一个)关系来确定继承关系,比如 "狗" 是一个 "动物",这种继承关系是合理的。
- 继承层次的深度和复杂度
- 避免过度复杂的继承层次。如果继承层次过深,代码的理解和维护会变得困难。例如,有一个继承层次为 A - B - C - D - E,当需要修改某个功能时,可能需要在多个层次的类中进行修改,而且很难追踪这些修改对整个系统的影响。一般来说,尽量保持继承层次较浅,使类之间的关系简单明了。
- 继承方式对访问权限的影响
- 不同的继承方式会改变基类成员在派生类中的访问权限。在private继承中,基类的public和protected成员在派生类中都变成private成员;在protected继承中,基类的public成员在派生类中变成protected成员。这可能会导致意外的访问限制,所以在选择继承方式时要谨慎考虑,确保符合程序的设计意图。
- 继承关系的合理性